6.5 代理proxy
java.lang.reflect.proxy,用于创建动态代理类和实例,
java.lang.reflect.InvocationHandler,使用动态代理创建实例时,需提供实现接口的类的实例。提供invoke方法,接收三个参数:代理对象、方法对象、方法参数。
适用场景:创建一个实现了一组给定接口的新类,在编译时无法确定实现哪个接口时才有不要使用。
代理类在运行时创建一个全新的接口类,实现指定的接口。具有指定接口的全部方法,Object类的全部方法。但不能在运行时定义这些方法的新代码,需提供一个调用处理器(invocationHandler),该处理器实现InvocationHandler接口,该接口中只有一个方法,Object invoke(Object proxy,Method method, Object[] args).
创建代理对象,Proxy.newProxyInstance方法,三个参数:类加载器、Class对象数组、调用处理器。
InvocationHandler handler = new TraceHandler(value);
Class[] interface = new Class[]{Comparable.class);
Object proxy = proxy.newProxyInstance(null, interface, handler)
二分查找案例,先用1-1000整数的代理填充数组,再用Arrays.binarySearch()查找一个随机整数。
Object[] elements = new Obect[1000];
for(int i= 0,;i<elements.length;i++){
Integer value = i+1;
element[i]= Proxy.newProxyInstance(…);
}
所有代理都扩展于proxy类,一个代理类只有一个实例域-调用处理器,定义在proxy的超类中。
没有定义代理类的名字,sun虚拟机中的proxy类将生成一个字符串$Proxy开头的类名。