动态代理学习及实现思路

动态带理的优点:编写一个带理工作处理器的类,可以替多个带理主题工作,只要带理工作一样就可以。

一、编写一个带理工作处理器的类,这个类必须实现一个接口InvocationHandler

//这是一个实现了InvocationHandler接口的带理工作处理器对象
public class Handler implements InvocationHandler {
	//传入被代理类
	private Object target;
	
	public Handler(Object target) {
		super();
		this.target = target;
	}
	/*
	* invoke方法参数说明
	* proxy:带理对象
	* method:被代理对象的方法参数
	* args:被代理对象的形参参数
	*/
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("带理类开始带理业务");
		long start = System.currentTimeMillis();
		//代理类实现被代理类的业务,开始运行被代理类的方法调用
		Object value = method.invoke(target, args);
		long end = System.currentTimeMillis();
		System.out.println("业务运行时间:" + (end - start));
		System.out.println("带理类完成任务运行");
		return value;
	}
	
}

二、需要代理的类对象

带理主题一

public interface AInterface {
	void test();
}

带理主题二

public interface BInterface {
	void test();
}

被代理对象类一

public class AProxy implements AInterface {

	@Override
	public void test() {
		System.out.println("代理类对象AProxy的test方法运行完成");
	}
	
}

被代理对象二

public class BProxy implements BInterface {

	@Override
	public void test() {
		System.out.println("代理类对象BProxy的test方法运行完成");
	}
	
}

三、通过JDK的中的Proxy类来创建带理类,并调用方法实现业务逻辑

public class TestProxy {
	public static void main(String[] args) {
		AProxy a = new AProxy();
		ClassLoader loader1 = a.getClass().getClassLoader();
		Class<?>[] interfaces1 = a.getClass().getInterfaces();
		Handler h1 = new Handler(a);
		AProxy aProxy = (AProxy) Proxy.newProxyInstance(loader1, interfaces1, h1);
		aProxy.test();
		
		System.out.println("------------------------");
		
		BProxy b = new BProxy();
		ClassLoader loader2 = b.getClass().getClassLoader();
		Class<?>[] interfaces2 = b.getClass().getInterfaces();
		Handler h2 = new Handler(b);
		BProxy bProxy = (BProxy) Proxy.newProxyInstance(loader2, interfaces2, h2);
		bProxy.test();
	}
}

由于我本地学习测试时使用的名称取名比较随意,以上代码是手敲的,可能存在对象使用不当的地方,使用时需要稍稍注意一下对象的使用就好了。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值