Java--JDK动态代理核心源码解析
来源:互联网 发布:permutation算法 编辑:程序博客网 时间:2024/06/04 18:09
达人科技 2016-12-06 21:55
1、首先我们了解一下JDK动态代理的使用方法:
public static void main(String[] args) { /** * 创建一个Bean对象,该对象实现BeanInterFace接口 */ BeanInterFace bean = new Bean; /** * 创建一个MyProxy对象,该对象实现InvocationHandler接口,将bean注入到MyProxy中 */ InvocationHandler invocationHandler = new MyProxy(bean); /** * 调用JDK的Proxy类,使用newProxyInstance方法,直接生成Bean对象的代理对象 * 注意:Classloader必须采用实际代理对象的ClassLoader,否则会出现反复调用的问题 */ BeanInterFace beanProxy = (BeanInterFace) Proxy.newProxyInstance(bean.getClass.getClassLoader, bean.getClass.getInterfaces,invocationHandler); /** * 使用代理对象 */ System.out.println(beanProxy.getClass.getName); beanProxy.say; }
2、我们看一下JDK源码,是如何实现动态代理的
Proxy.newProxyInstance最终会调用Proxy.ProxyClassFactory.apply方法生成代理Class
//创建proxyname,通过package+ClassName+编号String proxyName = proxyPkg + proxyClassNamePrefix + num; /* * 这里生成了代理的Class,并编译返回二进制byte数组 */ byte proxyClassFile = ProxyGenerator.generateProxyClass( proxyName, interfaces, accessFlags); try {//这里加载了ProxyClass,这里的加载用的是系统appClassLoader,至今我还没明白怎么才能使用,JDK使用的native方法 return defineClass0(loader, proxyName, proxyClassFile, 0, proxyClassFile.length); } catch (ClassFormatError e) { /* * A ClassFormatError here means that (barring bugs in the * proxy class generation code) there was some other * invalid aspect of the arguments supplied to the proxy * class creation (such as virtual machine limitations * exceeded). */ throw new IllegalArgumentException(e.toString); }
3、具体proxyClass是如何生成的
大致就是:
proxyClass有一个构造函数,该构造函数的参数为InvocationHandler接口,proxyClass实例化以后将InvocationHandler的引用储存在自己的属性中,然后proxyClass每个方法的触发都会触发InvocationHandler的invoke方法,通过反射调用真实对象的的方法。
0 0
- Java--JDK动态代理核心源码解析
- JDK动态代理源码解析
- jdk动态代理源码解析
- java动态代理Proxy源码解析(Jdk 1.6)
- Java JDK动态代理解析
- jdk的动态代理源码解析
- JDK动态代理(源码解析)
- 动态代理源码解析之JDK
- aop源码解析辅助-jdk动态代理
- JDK动态代理源码例子解析
- JDK核心JAVA源码解析(1)
- Java基础:JDK动态代理源码分析
- jdk动态代理,spring核心动态代理
- jdk动态代理解析
- JDK动态代理解析
- 基于jdk动态代理的实现与源码解析
- JAVA动态代理模式源码解析
- 动态代理源码解析
- Ajax最详细的参数解析和场景应用
- Java中的泛型定义
- Java中String、StringBuffer、StringBuilder区别与理解
- Android源码分析之Fragment的View管理
- ListView原来这么好用
- Java--JDK动态代理核心源码解析
- 进阶篇:1)DFMA方法的运用
- 超级js专家------------Cookie封装
- Spring之Advisors
- JAVA笔记之IO流第一部分
- SQL性能优化案例:分享一次系统迁移获得的经验
- MongoDB数据建模小案例:多列数据结构
- 吐丝消息
- Oracle SQL 查询排序