您的位置:首页 > 其它

【动态代理】使用构造方法创建代理类、使用 newProxyInstance.newProxyInstance()创建代理类

2014-03-31 15:51 561 查看
代理构架图:






动态代理的工作原理





——————————————————————————————————————————————
一、用构造方法创建代理类

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());
        
    }
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐