package cn.itcast_05_proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
public class ListDemo {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) throws Exception {
final List list = new ArrayList();
//这是被代理的
Object oo = Proxy.newProxyInstance(List.class.getClassLoader(),
list.getClass().getInterfaces(),new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.err.println("加入一个对象:");
Object returnValue = method.invoke(list, args);//反射
System.err.println("加入完成。。。。");
if(method.getName().equals("size")){
return 100;
}
return returnValue;
}
});
List list2 = (List) oo;
list2.add("aaa");
list2.add("bbb");
System.err.println("size:"+list2.size()+","+list.size());//100,2
//为什么调用3次?
//list2.size()这个也调用
}
}
代理实现流程:
1、书写代理类和代理方法,在代理方法中实现代理Proxy.newProxyInstance
2、代理中需要的参数分别为:被代理的类的类加载器soneObjectclass.getClassLoader(),被代理类的所有实现接口new Class[] { Interface.class },句柄方法new InvocationHandler()
3、在句柄方法中复写invoke方法,invoke方法的输入有3个参数Object proxy(代理类对象), Method method(被代理类的方法),Object[] args(被代理类方法的传入参数),在这个方法中,我们可以定制化的开发新的业务。
4、获取代理类,强转成被代理的接口
5、最后,我们可以像没被代理一样,调用接口的认可方法,方法被调用后,方法名和参数列表将被传入代理类的invoke方法中,进行新业务的逻辑流程。
原业务接口IBoss