Proxy类。该类即为动态代理类,可以使用反编译工具查看jdk里源码。JDK动态代理实现主要由Proxy类的newProxyInstance()方法实现。实现起来很容易,但是学习都要学习原理,所以本博客主要介绍jdk动态代理实现的源码。
newProxyInstance()方法用于根据传入的接口类型interfaces返回一个动态创建的代理类的实例,方法中第一个参数loader表示代理类的类加载器,第二个参数interfaces表示被代理类实现的接口列表,第三个参数h表示所指派的调用处理程序类。
首先写个例子实现jdk动态代理
主题接口类:
被代理的类:
JDK动态代理InvocationHandler类
写个类模拟字节码文件生成:
实现jdk动态代理是很容易的,不过现在介绍一下jdk源码,理解一下原理实现
下面看一下Proxy类里的newProxyInstance方法
从newProxyInstance方法可以看出,生产代理类是由getProxyClass0获取或者生成的。下面看一下getProxyClass0方法,从方法可以看出如果缓存中有代理类就直接返回代理的副本,否就使用ProxyClassFactory创建代理类。
proxyClassCache是一个WeakCache类型的缓存,它的构造函数有两个参数,其中一个就是用于生成代理类的ProxyClassFactory,看一下proxyClassCache.get方法的代码:
若缓存中找不到代理类,就使用ProxyClassFactory生产代理类,看一下ProxyClassFactory类的代码:
从ProxyClassFactory类可以看出生产字节码文件的执行代码由generateProxyClass方法执行:
看了这么久,终于知道generateClassFile是真正执行class文件生成的方法,现在看一下generateClassFile的代码:
使用反编译工具查看生产的字节码文件代码,说明了下文件中生成的部分与刚才分析的时候写入的过程的对应关系。:
领取专属 10元无门槛券
私享最新 技术干货