前一篇文章,稍微讲解了一下静态代理的原理,分为三部曲
第一步是定义一个共同使用的接口供目标类和代理类使用
第二步是代理类和目标类同时实现该接口,并且,代理类的实现类中需要有目标类的引用
第三步创建真实类对象和代理类对象,同时将真实类的引用传给代理类对象,调用代理类的方法,执行目标类的业务
相比于静态代理,这种在开始就已经定义好了代理类,动态代理的区别就是代理类对象的定义是有jmv动态生成的,jdk的动态代理借助InvocationHandle接口和Proxy类共同完成。
1.java.lang.reflect.Proxy:是jdk动态代理的主类
2.java.lang.reflect.InvocationHandler:是一个调用处理器,需要我们自定义其invoke方法,用于实现对于真实委托类的代理访问
jdk动态代理创建对象的过程步骤如下:
1.实现IncocationHandle接口创建自己的调用处理器,(调用处理器中需要引入目标类的实例)
InvocationHandler handler = new InvocationHandlerImpl(T target);
2.通过Proxy对象指定类装载器和一组interface接口,创建代理类
Class clazz = Proxy.getProxyClass(classLoader, new Class[] { Interface.class, ... });
3.通过反射机制获取动态代理类的构造方法,其参数是一个代用处理器类型的接口
Constructor constructor = clazz.getConstructor(new Class[] { InvocationHandler.class });
4.通过以上构造函数动态创建动态代理类的实例,构造是传入调用处理器作为唯一入参
以上是jdk动态代理标准的实现过程,作为简化,Proxy类中提供了另外一个方法newProxyInstance,相当于是封装了2,3,4步
因此,只需两步就能完成动态代理的对象的创建
1.InvocationHandler handler = new InvocationHandlerImpl(..);
2.// 通过 Proxy 直接创建动态代理类实例
Interface proxy = (Interface)Proxy.newProxyInstance( classLoader,
new Class[] { Interface.class },
handler );