[英]Understanding “proxy” arguments of the invoke method of java.lang.reflect.InvocationHandler
I would like to understand the purpose of the proxy
argument of the invoke
method of java.lang.reflect.InvocationHandler
. 我想了解java.lang.reflect.InvocationHandler
的invoke
方法的proxy
参数的用途。
this
instead? 为什么不使用this
呢? There's in fact little you can do with the actual proxy. 实际上,使用实际代理几乎无济于事。 Nevertheless it's part of the invocation context, and you can use it to gain information on the proxy using reflection, or use it in subsequent calls (when calling another method with that proxy, or as a result. 尽管如此,它还是调用上下文的一部分,您可以使用它通过反射来获取有关代理的信息,或者在后续调用中使用该代理(当使用该代理调用另一个方法时,或者作为结果)。
Example: an acccount class, which allows to deposit money, whose deposit()
method returns the instance again to allow method chaining: 示例:一个允许存款的帐户类,其deposit()
方法再次返回该实例以允许方法链接:
private interface Account {
public Account deposit (double value);
public double getBalance ();
}
Handler: 处理程序:
private class ExampleInvocationHandler implements InvocationHandler {
private double balance;
@Override
public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {
// simplified method checks, would need to check the parameter count and types too
if ("deposit".equals(method.getName())) {
Double value = (Double) args[0];
System.out.println("deposit: " + value);
balance += value;
return proxy; // here we use the proxy to return 'this'
}
if ("getBalance".equals(method.getName())) {
return balance;
}
return null;
}
}
And an example of its usage: 以及其用法示例:
Account account = (Account) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] {Account.class, Serializable.class},
new ExampleInvocationHandler());
// method chaining for the win!
account.deposit(5000).deposit(4000).deposit(-2500);
System.out.println("Balance: " + account.getBalance());
As for your second question: the runtime type can be evaluated using reflection: 至于您的第二个问题:可以使用反射来评估运行时类型:
for (Class<?> interfaceType : account.getClass().getInterfaces()) {
System.out.println("- " + interfaceType);
}
And your third question: ' this
' would refer to the invocation handler itself, not the proxy. 第三个问题是:“ this
”是指调用处理程序本身,而不是代理。
To complement Peter's answer. 补充彼得的回答。 I added the following line regarding the runtime-type of the proxy: 我添加了以下有关代理的运行时类型的行:
System.out.println("accountGetClass() : " + account.getClass());
Which outputs: 哪个输出:
accountGetClass() : class com.sun.proxy.$Proxy0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.