动态带理学习
动态带理的优点:编写一个带理工作处理器的类,可以替多个带理主题工作,只要带理工作一样就可以。
一、编写一个带理工作处理器的类,这个类必须实现一个接口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();
}
}
由于我本地学习测试时使用的名称取名比较随意,以上代码是手敲的,可能存在对象使用不当的地方,使用时需要稍稍注意一下对象的使用就好了。。。