JAVA之JDK动态代理

标签: java jdk 代理 | 发表时间:2014-02-20 15:12 | 作者:qindongliang1922
出处:http://www.iteye.com
在Java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过这个类和接口,可以生成JDK动态代理类或动态代理对象。

Proxy提供了用于创建动态代理类和代理对象的静态方法,它也是所有动态代理类的父类,如果在程序中为一个或多个接口动态的生成实现类,就可以使用Proxy来创建动态代理类,
如果需要为一个或多个接口动态的创建实例,也可以使用Proxy来创建动态代理实例。

Proxy提供了如下两个方法,来创建动态代理类和动态代理实例。

getProxyClass(ClassLoader loader, Class<?>... interfaces)
创建一个动态代理类所对应的Class对象,该代理类将实现interfaces所指定的多个接口,第一个ClassLoader参数指定生成动态代理类的类加载器。


newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
直接创建一个动态代理对象,该代理对象的实现类,实现了interfaces指定的系列接口,执行代理对象的每个方法都会被替换执行InvocationHandler对象的invoke方法。

实际上,即使采用第一个方法获取了一个动态代理类之后,当程序需要通过该代理类,来创建对象时一样,需要传入一个InvocationHandler对象,也就是说,系统生成的每个代理对象都有一个与之关联的的InvocationHandler对象。
代码演示:

package com.qin.aop;

/**
 * 通用的模拟AOP
 * 切面类,其方法可以在运行时被调入
 * 
 * **/
public class DogUtils {
	
/**
 * 
 * 第一个拦截器的方法
 * 
 * **/
	public void method1(){
		
		System.out.println("=======模拟第一个通用的方法==========");
		
	}
	
	
	/**
	 * 
	 * 第一个拦截器的方法
	 * 
	 * **/
		public void method2(){
			
			System.out.println("=======模拟第二个通用的方法==========");
			
		}
	
	

}



Dog接口,JDK动态代理只能给接口生成代理。
package com.qin.proxy;

/***
 * 
 * 定义Dog接口
 * */
public interface Dog {

	/**
	 * 
	 * 详细信息的方法
	 * **/
public 	void info();
	
	
	/**
	 * 运行的方法 
	 * 
	 * */
public	void run();
	
	
	
	
	
}


package com.qin.proxy.impl;

import com.qin.proxy.Dog;

/**
 * 
 * 实现类
 * **/
public class GunDog implements Dog {

	@Override
	public void info() {
		System.out.println("我是一只猎狗!  ");
		
	}

	@Override
	public void run() {
		
		System.out.println("我奔跑迅速!");
		
	}

	
	
	
	
}



package com.qin.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

import com.qin.aop.DogUtils;

 

/**
 * 动态代理的实现自定义类
 * 
 * 
 * **/
public class MyInvokationHandler  implements InvocationHandler{

	/*
	 * 需要被代理的对象
	 * **/
	private Object obj;
	
	
	
	 
	public void setObj(Object obj) {
		this.obj = obj;
	}




	/**
	 * 执行动态代理对象的所有方法时,
	 * 都会被替换成如下的invoke方法
	 * 
	 * ***/
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
	 DogUtils du=new DogUtils();
	 //执行DogUtils对象中的method1方法
	 du.method1();
	 //以target作为主调来执行method方法
	 Object  result=method.invoke(obj, args);
	 du.method2();
		return result;
	}

	 

	
	
}



package com.qin.proxy;

import java.lang.reflect.Proxy;


/**
 * 该对象为指定的target生成动态代理实例
 * 
 * **/
public class MyProxyFactory  {
	
	public static Object getProxy(Object obj){
		
		//创建一个MyInvokationHandler对象
		MyInvokationHandler hadler=new MyInvokationHandler();
		
		hadler.setObj(obj);
		//创建并返回一个动态代理
		
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), hadler);
		
	} 
	

}


测试:
package com.qin.test;

import com.qin.proxy.Dog;
import com.qin.proxy.MyProxyFactory;
import com.qin.proxy.impl.GunDog;

/**
 * 
 *  测试驱动类
 * **/
public class Test {

	
	
	
	public static void main(String[] args) {
		Dog target=new GunDog();
		  
		Dog dog=(Dog)MyProxyFactory.getProxy(target);
		 
		dog.info();
		dog.run();
		
		
	}
	
}


结果输出如下:

=======模拟第一个通用的方法==========
我是一只猎狗!  
=======模拟第二个通用的方法==========
=======模拟第一个通用的方法==========
我奔跑迅速!
=======模拟第二个通用的方法==========




已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java jdk 代理] 推荐:

JAVA之JDK动态代理

- - Java - 编程语言 - ITeye博客
在Java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过这个类和接口,可以生成JDK动态代理类或动态代理对象. Proxy提供了用于创建动态代理类和代理对象的静态方法,它也是所有动态代理类的父类,如果在程序中为一个或多个接口动态的生成实现类,就可以使用Proxy来创建动态代理类,.

JDK动态代理机制

- - CSDN博客编程语言推荐文章
    代理模式有两种,一种是静态代理,这种方式需要为每一个被代理类写一个代理类,显示比较麻烦. 还一种是动态代理,动态代理实现方式一般有两种,JDK动态代理与CGLIB动态代理,这里说一下对JDK动态代理的理解.     JDK动态代理最核心的就类就是java.lang.reflect.Proxy,可调用Proxy.newInstance(..)生成动态代理.

Spring AOP 代理机制 JDK&CGLIB

- - 开源软件 - ITeye博客
Spring AOP使用JDK动态代理或者CGLIB来为目标对象创建代理. (建议优先使用JDK的动态代理). 如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理. 所有该目标类型实现的接口都将被代理. 若该目标对象没有实现任何接口,则创建一个CGLIB代理. 如果你希望强制使用CGLIB代理,(例如:希望代理目标对象的所有方法,而不只是实现自接口的方法) 那也可以.

动态代理双剑客--JDK Proxy与CGLIB

- - CSDN博客推荐文章
研究过设计模式的同胞们都知道代理模式可以有两种实现方案:. 1.接口实现(或继承抽象类). 都可以通过Proxy控制对Target的访问. “接口实现”的方式更加灵活,代理类可以代理所有实现了ISubject接口的类;. “继承父类”的方式代理类只能代理它的父类,因为java中只支持单继承. 如果Target有直接接口,那么这两种方式都可以;.

[iteye]每个Java开发者都应该知道的5个JDK工具

- - PHP & Java
【编者按】JDK是Java语言的软件开发工具包,没有它就无法编译Java程序. 目前,有许许多多的JDK工具呈现在大家面前,但最常用的莫过于java.exe、javac.exe、jar等. 本文作者Joe拥有多年的Java开发经验,其在博客上分享了一篇文章: 5 JDK Tools Every Java Developer Should Know,笔者对其进行了编译,以下为译文.

实现动态代理的两种方式介绍+例子demo(JDK、CGlib)

- - CSDN博客架构设计推荐文章
JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢. CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑. JDK动态代理与CGLib动态代理均是实现Spring AOP的基础.

java 动态代理(Proxy)

- - BlogJava_首页
动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实,代理对象对客户隐藏了实际对象. 动态代理可以对请求进行其他的一些处理,在不允许直接访问某些类,. 或需要对访问做一些特殊处理等,这时候可以考虑使用代理. 目前 Java 开发包中提供了对动态代理的支持,但现在只支持对接口的实现. 主要是通过 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口.

Sun JDK 1.6内存管理

- 小丑鱼 - 淘宝JAVA中间件团队博客
分为使用篇、调优篇和实现篇三个部分,使用篇为填鸭式,调优篇为pattern式,实现篇为启发式,三个PPT的目标为:. 1.掌握Sun JDK的内存区域的划分;. 2.掌握Sun JDK垃圾收集器的使用方法和触发时机;. 4.掌握一些基本的GC调优的方法;. 5.了解自动内存管理的常见实现方法,以及Sun JDK所做的优化.

JDK自带监控工具

- - ITeye博客
         系统在生产运行过程中最重要的工作莫过于监控与问题的处理,监控是预防问题产生很重要的手段. 在监控过程中可以发现那些模块或进程出现了问题,出现问题后会及时通知问题负责人.         实现监控的手段非常多,有系统级别监控系统,也有监控小工具等等. Java 就已经自带了一些监控工具,可以不借助外部软件的情况下简单、快速查看相应监控信息.

Java事务(五) - 使用动态代理

- - CSDN博客推荐文章
在 上一篇博文中, 我们使用模板模式进行事务管理, 代码看起来已经很简洁了, 但是还是不太完美, . 我们依然需要在service层编写和事务相关的代码, 即我们需要在service层宗声明一个TransactionTemplate.. 本篇文章中, 我们将使用Java提供的动态代理来完成事务处理, 你将看到无论在service层还是在dao层都不会.