【Java进阶-Java动态代理与AOP】04 实现InvocationHandler的invoke方法
InvocationHandler接口中仅有一个抽象方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
其中包含三个参数
proxy: 代理对象,帮助目标对象做事情的对象(卖联想电脑的代理商)
method: 代理对象要执行目标对象要完成的任务(帮A买联想电脑)
args: method方法需要的参数(需要的联想电脑的性能参数)需要说明的是,这三个参数的传递是JDK自动完成的,我们只需要“按部就班”给出接口所需要的参数,就可以得到所要的动态类了,继而可以创建对象并完成某些操作。
@Test
public void getProxy() {
System.out.println("new proxy instance ");
Collection collProxy = (Collection)Proxy.newProxyInstance(
Collection.class.getClassLoader(),
new Class[]{Collection.class},
new InvocationHandler(){
// 此处是硬编码,缺乏灵活性
ArrayList target = new ArrayList(); // 目标对象(联想公司电脑销售部)
@Override
/**
* proxy: 代理对象,帮助目标对象做事情的对象(卖联想电脑的代理商)
* method: 代理对象要执行目标对象要完成的任务(帮A买联想电脑)
* args: method方法需要的参数(需要的联想电脑的性能参数)
*
* 代理最简单的实现是 return method.invoke(target, args);
* 但是代理在返回值之前可以做其他事情,比如说过滤 args参数,不合格不予执行等等。
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// return method.invoke(target, args);
System.out.println("execute.....");
long startTime = System.currentTimeMillis();
Thread.sleep(1000);
Object retVal = method.invoke(target,args);
long endTime = System.currentTimeMillis();
System.out.println(method.getName() + " execute time is " + (endTime - startTime));
return retVal;
}
});
collProxy.add("123");
collProxy.add("abc");
int size = collProxy.size(); //invoke的返回值
System.out.println(size);
System.out.println(collProxy.getClass().getName());// com.sun.proxy.$Proxy0
//分析:查看 Proxy API文档:
//对于从Object继承过来的方法,只有 equals,hashCode和toString三个方法委托给handler处理,其他方法自己处理,如getClass方法
}
可能还会存在对InvocationHandlerder对象运行的疑惑,我们将在下一篇文章中讲解。