我查了this stackoverflow帖子。但我还是不明白。
在JDK代理中,Proxy.newInstance(arg1,arg2,arg3)创建新的代理实例。当我们在这个代理实例上调用一个方法时,它调用它的相关调用处理程序。调用处理程序的invoke方法将调用委托给实际方法。
invoke方法有3个参数。第一个被称为进行调用的代理实例。我怀疑代理实例是如何传递给调用处理程序调用方法的?
为了更清楚地理解我的疑问,请参阅下面的代码。
接口
package proxyclasses;
public interface Animal {
public abstract void eat(String food);
}
具体类
package proxyclasses;
public class Cow implements Animal {
public void eat(String food) {
System.out.println("Cow eats "+food);
}
}
代理类
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("Proxy "+proxy.getClass().getName());
Object result = method.invoke(target, args);
return result;
}
}
主类
import java.lang.reflect.Proxy;
import proxy.MyInvocationHandler;
import proxyclasses.Animal;
import proxyclasses.Cow;
public class ProxyExample {
public static void main(String args[]){
Cow cow = new Cow();
Animal proxInstance = (Animal)Proxy.newProxyInstance(Cow.class.getClassLoader(),Cow.class.getInterfaces(),new MyInvocationHandler(cow));
proxInstance.eat("Grass");
}
}
我怀疑主要类中的'proxInstance'是如何传递给myInvocationHandlers调用方法的?
答案 0 :(得分:0)
我怀疑主要类中的'proxInstance'是如何传递给myInvocationHandlers调用方法的?
您似乎回答了自己的问题。
当我们在这个代理实例上调用一个方法时,它调用它的相关调用处理程序
所以你有类似
的东西Method method = ...
Object[] args = ...
handler.invoke(this, method, args);
其中this
是包装处理程序的代理对象,即您调用的代理。