1. public static Object newProxyInstance(ClassLoader loader, Class[] interfaces,InvocationHandler h) 通过这个类Proxy的这个方法生成代理对象。第一个参数是需要指明传入的类加载器。 第二个是需要代理的接口(也就是目标对象实现的接口),这里是个数组,因为一个类可以实现多个接口。第三个是具体代理对象需要执行的逻辑实现,这是一个接口需要我们自己去实现。
2. private static Class getProxyClass0(ClassLoader loader,Class... interfaces) 这个也是Proxy中的方法,在第一个方法中调用。是获取代理对象class的核心方法。这个第一个是是类加载器,第二个是目标对象的所实现接口。
这个方法核心代码proxyClassCache 这个是一个缓存对象,如果简单理解可以认为是代理对象的缓存池,如果缓存中有则把缓存的代理class 取出来,没有则需要生成代理对象把它放进去。然后返回这个代理对象。
3. ProxyClassFactory.apply(ClassLoader loader, Class[] interfaces) 代理工厂生产代理Class这个方法前面主要是一些校验,核心是下面这两行代码
生成代理class核心代码第一个是根据根据代理类的类名,接口名称,accessFlags 生成一个byte[] 数组的字节码。defineClass0 是native 方法,java 虚拟机调用本地方法生成代理Class 对象
4. 利用反射通过包含InvocationHandler 这个参数的构造函数的方法实例化这个代理对象,到此jdk生成代理对象结束
网友评论