public interface InvocationHandler{
Object invoke (Object proxy, Method method, Object[] args) throws Throwable;
}
此invoke将拦截所有代理的方法调用,包含了继承自Object的方法
1. 可以调用toString()和hashCode()方法的,需要自己在invoke中进行处理如:
Object invoke (Object proxy, Method method, Object[] args) throws Throwable{
if (method.getName().equals('toString')) {....}
else if (method.getName().equals('hasCode')) {....}
}
实际上你任何执行此方法都是错误的:method.invoke(proxy, argus),注意这里的proxy本身就是代理,如果代理执行invoke,那么还是会被InvocationHandler.invoke拦截的,也就是任何method.invoke(proxy,argus)依然还是对InvocationHandler.invoke的调用 ,恭喜从此进入死循环了
2 代理可以是对真实存在的对象进行代理,
所以你需要方法setTarget(),更好的做法是在构造InvocationHandler时输入,如:
new MyInvocationHandler(target);
你可以使用
Object invoke (Object proxy, Method method, Object[] args) throws Throwable{
if (method.getName().equals('toString') || method.getName().equals('hasCode')) {return method.inoke(target, args); }
}
3 代理也可以是一个虚幻的对象实例,只是这个实例的所有方法实现在InvocationHandler.invoke 中实现的