---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
一、代理作用
import java.lang.reflect.Proxy;
import java.util.Collection;
public class ProxyTest2 {
/**
* @param args
*/
public static void main(String[] args) {
Class clazzProxy = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
System.out.println(clazzProxy.getName());
}
}
import java.lang.reflect.Constructor;
import java.lang.reflect.Proxy;
import java.util.Collection;
public class ProxyTest2 {
/**
* @param args
*/
public static void main(String[] args) {
Class clazzProxy = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
System.out.println(clazzProxy.getName());
//获取Proxy的构造函数
Constructor[] constructors = clazzProxy.getConstructors();
System.out.println(constructors.length);
Constructor proxyConstructor = constructors[0];
//获取构造函数的参数列表
Class[] clazzParameterTypes = proxyConstructor.getParameterTypes();
StringBuilder sb = new StringBuilder();
sb.append(proxyConstructor.getName());
for(Class clazzParameterType:clazzParameterTypes){
sb.append("(");
sb.append(clazzParameterType.getName());
sb.append(")");
}
System.out.println(sb.toString());
}
}
四、创建动态代理类的对象
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
public class ProxyTest2 {
/**
* @param args
* @throws Exception
* @throws
* @throws
* @throws
*/
public static void main(String[] args) throws Exception {
Class clazzProxy = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
System.out.println(clazzProxy.getName());
//获取Proxy的构造函数
Constructor[] constructors = clazzProxy.getConstructors();
System.out.println(constructors.length);
Constructor proxyConstructor = constructors[0];
//创建动态代理的对象
Collection collection = (Collection)proxyConstructor.newInstance(new InvocationHandler() {
ArrayList<String> al = new ArrayList<String>();
Object retVal = null;
@Override//复写invoke方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
retVal = method.invoke(al, args);
return retVal;
}
});
//调用代理类
collection.add("1");
collection.add("2");
collection.add("3");
System.out.println(collection.size());
}
}
五、动态生成的类的内部代码分析
动态类在调用方法时将三要素作为参数传递给了InvocationHandler对象,InvocationHandler对象调用自己的invoke方法,并在内部调用目标类的方法,并且在内部还可以增加系统功能方法。
动态代理的工作原理图
在实际应用中将创建代理类封装成一个方法,并将系统的功能代码封装进对象,作为参数传递进去,通过调用这个对象的方法来完成系统的功能代码块。
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>