步入正题之前,先闲聊几句。
思想:动态代理是利用反射的机制在运行时动态的创建类
- 反射:动态创建对象
- 动态代理:动态创建类
了解动态代理,反射有助于了解框架的底层实现,才能更好的运用框架。
看这一篇前,可以先参考一下上一篇文章
https://blog.csdn.net/meetbetterhc/article/details/99597369
步入正题……
老样子,先看一下类结构
其中Service和Target与上一篇中的一样,这里我就不啰嗦了,上边有链接
其实,Service2和Target2与上边几乎一样
Service2类
package com.design.dynamicproxy;
public interface Service2 {
public void m4();
public void m5();
public void m6();
}
Target2类
package com.design.dynamicproxy;
public class Target2 implements Service2 {
@Override
public void m4() {
System.out.println("target2 m4");
}
@Override
public void m5() {
System.out.println("target2 m5");
}
@Override
public void m6() {
System.out.println("target2 m6");
}
}
DynamicProxy类
package com.design.dynamicproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 动态代理
*/
public class DynamicProxy {
// 利用反射动态生成代理类
// 为target对象生成一个用于计数的代理对象
public static Object createProxy(Object target){
// 三个参数分别是:类加载器,类实现的接口,匿名内部类(重写invoke方法)
Object o=Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
long t1=System.nanoTime();
// 调用目标对象的相应方法
Object o=method.invoke(target,args);//反射 :方法.调用(对象,参数)
long t2=System.nanoTime();
System.out.println(t2-t1);
return o;
}
});
return o;
}
}
Test类
package com.design.dynamicproxy;
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
Service t1=new Target();
Service p1=(Service) DynamicProxy.createProxy(t1);
// 不管p1调用的是哪个方法,实际上都调用的是invoke方法,invoke方法里写代理做什么的逻辑
p1.m1();
p1.m2();
p1.m3();
Service2 t2=new Target2();
Service2 p2= (Service2) DynamicProxy.createProxy(t2);
p2.m4();
p2.m5();
p2.m6();
}
}