java proxy 代理

spring AOP 使用动态代理技术在运行期织入增强的代码,动态代理分为基于jdk的和基于CGLib两种,jdk本身只提供接口的代理,而cglib支持类的代理.

1.jdk动态代理

jdk1.3以后,java提供了动态代理技术,允许开发者在运行期创建接口的代理实例.jdk动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler.

其中InvocationHandler是一个接口,可卡因通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起.而Proxy利用InvocationHandler动态的创建一个符合某一接口的实例,生成目标类的代理对象.


以下是示例代码:



①接口

public interface Count {
	/**
	 * 查看账户方法
	 */
	public void queryCount();

}

②实现类

public class CountImpl implements Count {

	@Override
	public void queryCount() {
		System.out.println("query method...");
	}

}

③代理类

public class CountProxy2 implements InvocationHandler {
	//要代理的目标类实例
	Object target = null;
	public CountProxy2(Object target) {
		this.target = target;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		//调用目标类方法前
		System.out.println("before.....");
		Object result = method.invoke(target, args);
		//调用目标类方法后
		System.out.println("after.....");
		//返回代理类
		return result;
	}

④测试代码

/**
*
* Proxy.newProxyInstance方法会做如下几件事:
* 
* 1,根据传入的第二个参数interfaces动态生成一个类,实现interfaces中的接口,
* 	该例中即BusinessProcessor接口的processBusiness方法
* 	。并且继承了Proxy类,重写了hashcode,toString,equals等三个方法。具体实现可参看
* 	ProxyGenerator.generateProxyClass(...); 该例中生成了$Proxy0类
* 
* 2,通过传入的第一个参数classloder将刚生成的类加载到jvm中。即将$Proxy0类load
* 
* 3,利用第三个参数,调用$Proxy0的$Proxy0(InvocationHandler)构造函数
* 	创建$Proxy0的对象,并且用interfaces参数遍历其所有接口的方法,并生成Method对象初始化对象的几个Method成员变量
*
*/
public class CountTest {

	public static void main(String[] args) {
		
		CountImpl countImpl = new CountImpl();
		CountProxy2 handler = new CountProxy2(countImpl);
		Count count = (Count) Proxy.newProxyInstance(countImpl.getClass().getClassLoader(), 
				countImpl.getClass().getInterfaces(), handler);
		count.queryCount();
		
	}
	
}

⑤打印结果

before.....
query method...
after.....


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值