【动态代理】使用构造方法创建代理类、使用 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
原创粉丝点击