一、概述
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()); }}