【动态代理】使用构造方法创建代理类、使用 newProxyInstance.newProxyInstance()创建代理类
2014-03-31 15:51
561 查看
代理构架图:
动态代理的工作原理
——————————————————————————————————————————————
一、用构造方法创建代理类
1)得到代理类的Class对象,反射出所有构造方法、所有方法
运行结果
2)通过构造[b]方法创建代理类。[/b]
[b]二、快速创建代理类[/b]
Proxy提供了一个方法 newProxyInstance可以直接创建代理类。底层也是使用构造方法创建代理类。
注意:
hashCode(),equals()或toString()通过代理类调用,getClass()不经过代理类调用
动态代理的工作原理
——————————————————————————————————————————————
一、用构造方法创建代理类
1)得到代理类的Class对象,反射出所有构造方法、所有方法
package jingtianxiaozhi; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Collection; public class Test2 { public static void main(String[] args) { Class proxyClass=Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class); System.out.println("-----------------实体类名--------------"); System.out.println(proxyClass.getName()); System.out.println("-----------------构造函数--------------"); /*$Proxy0(java.lang.reflect.InvocationHandler)*/ Constructor[] constructors = proxyClass.getConstructors(); for(Constructor constructor : constructors){ String name = constructor.getName(); StringBuilder sBuilder = new StringBuilder(name); sBuilder.append('('); Class[] clazzParams = constructor.getParameterTypes(); for(Class clazzParam : clazzParams){ sBuilder.append(clazzParam.getName()).append(','); } if(clazzParams!=null && clazzParams.length != 0) sBuilder.deleteCharAt(sBuilder.length()-1); sBuilder.append(')'); System.out.println(sBuilder.toString()); } System.out.println("-----------------方法(参数)--------------"); Method[] methods = proxyClass.getMethods(); for(Method method : methods){ String name = method.getName(); StringBuilder sBuilder = new StringBuilder(name); sBuilder.append('('); Class[] clazzParams = method.getParameterTypes(); for(Class clazzParam : clazzParams){ sBuilder.append(clazzParam.getName()).append(','); } if(clazzParams!=null && clazzParams.length != 0) sBuilder.deleteCharAt(sBuilder.length()-1); sBuilder.append(')'); System.out.println(sBuilder.toString()); } } }
运行结果
2)通过构造[b]方法创建代理类。[/b]
package test2; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.Collection; public class Test2 { public static void main(String[] args) throws Exception{ final ArrayList arrayList=new ArrayList(); Class proxyClass=Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class); Constructor constructor = proxyClass.getConstructor(InvocationHandler.class); class MyInvocationHander1 implements InvocationHandler{ public Object invoke(Object proxy, Method method, Object[] args)throws Throwable { System.out.println("InvocationHandler的 invoke() 被调用了"); Object object=method.invoke(arrayList, args); return object; } } Collection proxy1 = (Collection)constructor.newInstance(new MyInvocationHander1()); System.out.println(proxy1.getClass().getName()); System.out.println(proxy1.size()); } }
[b]二、快速创建代理类[/b]
Proxy提供了一个方法 newProxyInstance可以直接创建代理类。底层也是使用构造方法创建代理类。
package jingtianxiaozhi; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.Collection; public class Test2 { public static void main(String[] args) throws Exception{ final ArrayList arrayList=new ArrayList(); Collection proxy=(Collection) Proxy.newProxyInstance(ArrayList.class.getClassLoader(),ArrayList.class.getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args)throws Throwable { System.out.println("InvocationHandler的 invoke() 被调用了"); Object object=method.invoke(arrayList, args); return object; } }); System.out.println(proxy.getClass().getName()); System.out.println(proxy.size()); } }
注意:
hashCode(),equals()或toString()通过代理类调用,getClass()不经过代理类调用
package jingtianxiaozhi; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.Collection; public class Test2 { public static void main(String[] args) throws Exception{ final ArrayList arrayList=new ArrayList(); Collection proxy=(Collection) Proxy.newProxyInstance(Collection.class.getClassLoader(),new Class[]{Collection.class}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args)throws Throwable { System.out.println("InvocationHandler的 invoke() 被调用了"); return method.invoke(arrayList, args); } }); System.out.println(proxy.getClass().getName()); System.out.println("---------------------------------"); System.out.println(proxy.toString()); } }
相关文章推荐
- 解决Proxy.newProxyInstance创建动态代理导致类型转换错误的问题
- Proxy.newInstance会创建几个代理类
- Java-马士兵设计模式学习笔记-代理模式-动态代理 调用Proxy.newProxyInstance()
- 使用java.lang.reflect.Proxy和InvocationHandler创建动态代理(仅代理接口)
- 动态代理(3)- newProxyInstance()实现原理
- 动态代理之Proxy.newProxyInstance()
- 【重点:动态代理】创建一个类MyProxyManger调用getProxy即可以创建一个代理类
- 使用Proxy.newProxyInstance()代理时,报错java.lang.ClassCastException: com.sun.proxy.$Proxy61
- Proxy.newProxyInstance动态代理[z]
- 通过动态代理(Proxy)实现的数据库连接池的创建连接与归还链接的操作的简单的实现流程
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
- Java事务(6)——使用动态代理(Dynamic Proxy)
- Java动态代理一——动态类Proxy的使用
- 如何使用Proxy模式及Java内建的动态代理机制
- 使用Java的Proxy类实现动态代理(Dynamic Proxy)
- 代理模式Proxy(动态代理)在程序运行时,运用反射机制动态创建而成
- 41-知识补充(UIPickerView的补充方法,使用self创建对象的好处,id和instancetype区别,KVC底层代码实现,文本框的两个代理方法)
- 从代理模式再出发!Proxy.newProxyInstance的秘密
- Java 动态代理Proxy和Invacationhandler的使用
- 使用CGLIB包创建动态代理