InvocationHandler中invoke方法中的第一个参数proxy的用途
2017-03-03 21:25
423 查看
最近在研究Java的动态代理时对InvocationHandler中invoke方法中的第一个参数一直不理解它的用处,某度搜索也搜不出结果,最后终于在stackoverflow上找到了答案。
这是原文的链接:http://stackoverflow.com/questions/22930195/understanding-proxy-arguments-of-the-invoke-method-of-java-lang-reflect-invoca
原文对这个参数的解释是:
1. 可以使用反射获取代理对象的信息(也就是proxy.getClass().getName())。
2. 可以将代理对象返回以进行连续调用,这就是proxy存在的目的。因为this并不是代理对象,
下面看源代码
接口:
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;
}
}
使用:
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());我们看到如果返回proxy的话可以对该代理对象进行连续调用
那为什么不返回this,而是返回proxy对象呢?
因为this对象的类型是ExampleInvocationHandler,而不是代理类$Proxy0
除此之外,不返回代理对象的话,还能返回其他信息,如balance。
这是原文的链接:http://stackoverflow.com/questions/22930195/understanding-proxy-arguments-of-the-invoke-method-of-java-lang-reflect-invoca
原文对这个参数的解释是:
1. 可以使用反射获取代理对象的信息(也就是proxy.getClass().getName())。
2. 可以将代理对象返回以进行连续调用,这就是proxy存在的目的。因为this并不是代理对象,
下面看源代码
接口:
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;
}
}
使用:
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());我们看到如果返回proxy的话可以对该代理对象进行连续调用
那为什么不返回this,而是返回proxy对象呢?
因为this对象的类型是ExampleInvocationHandler,而不是代理类$Proxy0
除此之外,不返回代理对象的话,还能返回其他信息,如balance。
相关文章推荐
- InvocationHandler中invoke方法中的第一个参数proxy的用途
- maven Spring 3.2+SpringMVC+dubbo解决TypeProxyInvocationHandler.invoke(SerializableTypeWrapper.java:239
- InvocationHandler中invoke()方法的调用问题
- maven Spring 4.2+SpringMVC+dubbo解决TypeProxyInvocationHandler.invoke(SerializableTypeWrapper.java:239)
- maven Spring 4.2+SpringMVC+dubbo解决TypeProxyInvocationHandler.invoke(SerializableTypeWrapper.java:239
- InvocationHandler中invoke()方法的调用问题
- maven Spring 4.2+SpringMVC+dubbo解决TypeProxyInvocationHandler.invoke(SerializableTypeWrapper.java:239
- InvocationHandler中invoke()方法的调用问题
- JDK动态代理的invoke方法的第一个参数是什么
- 理解动态代理的神器:InvocationHandler中invoke()方法的调用问题
- InvocationHandler中invoke()方法的调用问题
- maven Spring 4.2+SpringMVC+dubbo解决TypeProxyInvocationHandler.invoke(SerializableTypeWrapper.java:239
- InvocationHandler的invoke方法的第一个参数问题
- InvocationHandler中invoke()方法的调用问题
- spring动态代理的实现原理InvocationHandler中invoke()方法的调用问题
- maven Spring 4.2+SpringMVC+dubbo解决TypeProxyInvocationHandler.invoke(SerializableTypeWrapper.java:239
- JDK动态代理中关于InvocationHandler中invoke()方法的调用问题
- InvocationHandler中invoke()方法的调用问题
- InvocationHandler中invoke()方法的调用问题
- 动态代理 Proxy InvocationHandler学习