动态代理
生成动态对象的实现,需要传三个参数
- 真实对象的类加载器
- 真实对象的实现的所有接口
- 你想要实现的代理策略(代理方法)
public Object getProxyInstance() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(),//类加载器,用来生成类
target.getClass().getInterfaces(), //接口类型,实现所有的接口
new InvocationHandler() { //事情处理
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("JDK 代理开始~~");
Object returnVal = method.invoke(target, args); //执行原来的方法
System.out.println("JDK 代理提交");
return returnVal;//方法的返回值
}
});
}
源码参考自 https://cloud.tencent.com/developer/article/1076131
-
先根据传进的 ClassLoader(类加载器) 和 interfaces(接口) 生成代理类
- 代理类 继承自 Proxy类 (后序还要调用Proxy类的处理器来执行代理方法)
- 实现了 用户自定义的 接口(为了获取接口的信息)
-
代理类内部会调用Proxy的构造方法设置处理器 InvocationHandler
-
public ProxySubject(InvocationHandler paramInvocationHandler)throws { super(paramInvocationHandler); //调用Proxy的构造方法设置处理器 }
-
-
代理对象内部会根据反射来存有对应接口的一堆方法
-
m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") }); m3 = Class.forName("com.dynamic.test.People").getMethod("sayBye", new Class[] { Class.forName("java.lang.String") });
-
-
代理对象真正执行方法的时候是调用 InvocationHandler 里的invoke方法
-
this.h.invoke(this, m4, new Object[] { paramString }); //this.h 是父类Proxy的InvocationHandler,在步骤2设置了, //invoke 则方法是生成代理类时候重写的方法 //public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {}
-
-
所以其实转了一圈,代理对象最终执行的方法即是newProxyInstance传进去的第三个参数(InvocationHandler),有点策略模式的味道,最终要执行的代理策略是由用户自己决定的策略,将控制权交给了生成代理对象的用户