【动态代理】使用构造方法创建代理类、使用 newProxyInstance.newProxyInstance()创建代理类
来源:互联网 发布:中世纪2沙皇卫队数据 编辑:程序博客网 时间:2024/04/30 15:25
代理构架图:
动态代理的工作原理
——————————————————————————————————————————————
一、用构造方法创建代理类
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)通过构造方法创建代理类。
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());}}
二、快速创建代理类
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()); }}
0 0
- 【动态代理】使用构造方法创建代理类、使用 newProxyInstance.newProxyInstance()创建代理类
- Proxy.newProxyInstance动态代理[z]
- 动态代理之Proxy.newProxyInstance()
- 代理模式 Proxy.newProxyInstance
- java 代理Proxy.newProxyInstance
- 代理Proxy.newproxyinstance
- 解决Proxy.newProxyInstance创建动态代理导致类型转换错误的问题
- 动态代理(3)- newProxyInstance()实现原理
- JAVA动态代理之java.lang.reflect.Proxy.newProxyInstance源码
- 使用Proxy.newProxyInstance()代理时,报错java.lang.ClassCastException: com.sun.proxy.$Proxy61
- 使用Cglib创建动态代理
- 创建多线程 使用代理方法
- java创建动态代理类
- 代理创建和使用
- 从代理模式再出发!Proxy.newProxyInstance的秘密
- 使用CGLIB包创建动态代理
- 使用动态代理创建数据库连接池
- 使用cglib形式创建动态代理
- UML建模图解教程知识点
- Androidpn XMPP JID对象xmppUsername大写被转成小写
- 词性标注(POS tagging)
- BUPT OJ189 Draw Bones
- ZedBoard学习手记(七)小插曲:如何让代码开机自动运行
- 【动态代理】使用构造方法创建代理类、使用 newProxyInstance.newProxyInstance()创建代理类
- P2P网络摄像机
- ros dynamixel_motors stack
- C++ const解析
- Java注解
- HPROF: 一个Heap/CPU Profiling工具
- oracle找回drop删除的表
- ZedBoard学习手记(八) 更大的目标!在Linux下开发图形用户界面
- 一步一步教你安装Nginx+PHP+Mysql