一、概述
1、先通过反射创建一个代理类功能的Class对象
2、创建代理类的实例,并通过调用代理类的方法来调用目标对象
二、代码说明
package staticimport.proxy;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Collection;
import java.util.Objects;
/***
*
* 1、先通过反射创建一个代理类功能的Class对象
* 2、创建代理类的实例,并通过调用代理类的方法来调用目标对象
*
* @author Liu
*
*/
public class ProxyTest {
//通过反射或者一个代理对象的Class
public static void main(String[] args) throws Exception {
Class clazz = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
Constructor[] constructors = clazz.getConstructors();
System.out.println("----------------Constructors list-----------------");
for(Constructor constructor : constructors){
StringBuilder sb = new StringBuilder(constructor.getName());
sb.append('(');
Class[] classes = constructor.getParameterTypes();
for(Class clzz : classes){
sb.append(clzz.getName()).append(',');
}
if(Objects.nonNull(classes) && classes.length != 0){
sb.deleteCharAt(sb.length() - 1);
}
sb.append(')');
System.out.println(sb);
}
System.out.println("----------------Methods list-----------------");
Method[] methods = clazz.getMethods();
for(Method method : methods){
StringBuilder sb = new StringBuilder(method.getName());
sb.append('(');
Class[] classes = method.getParameterTypes();
for(Class clzz : classes){
sb.append(clzz.getName()).append(',');
}
if(Objects.nonNull(classes) && classes.length != 0){
sb.deleteCharAt(sb.length() - 1);
}
sb.append(')');
System.out.println(sb);
}
/*********************利用反射创建实例**********************/
Constructor constructor = clazz.getConstructor(InvocationHandler.class);
Collection collection = (Collection) constructor.newInstance(new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//死循环
// return method.invoke(proxy, args);
return null;
}});
System.out.println(collection);
System.out.println(collection.toString());
//而这里为什么不报错?因为clear()方法返回值为void
collection.clear();
//这里为什么报空指针异常?因为传递给构造器的InvocationHandler中的invoke返回值是null
System.out.println(collection.size());
}
}