InvocationHandler 第一个参数 proxy

来源:互联网 发布:文本相似度算法 评分 编辑:程序博客网 时间:2024/05/16 19:19

转自:http://blog.csdn.net/bu2_int/article/details/60150319点击打开链接

最近在研究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并不是代理对象,


下面看源代码

接口:

[java] view plain copy
  1. private interface Account {  
  2.     public Account deposit (double value);  
  3.     public double getBalance ();  
  4. }  

Handler:

[java] view plain copy
  1. private class ExampleInvocationHandler implements InvocationHandler {  
  2.   
  3.     private double balance;  
  4.   
  5.     @Override  
  6.     public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {  
  7.   
  8.         // simplified method checks, would need to check the parameter count and types too  
  9.         if ("deposit".equals(method.getName())) {  
  10.             Double value = (Double) args[0];  
  11.             System.out.println("deposit: " + value);  
  12.             balance += value;  
  13.             return proxy; // here we use the proxy to return 'this'  
  14.         }  
  15.         if ("getBalance".equals(method.getName())) {  
  16.             return balance;  
  17.         }  
  18.         return null;  
  19.     }  
  20. }  

使用:

[java] view plain copy
  1. Account account = (Account) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] {Account.class, Serializable.class},  
  2.     new ExampleInvocationHandler());  
  3.   
  4. // method chaining for the win!  
  5. account.deposit(5000).deposit(4000).deposit(-2500);  
  6. System.out.println("Balance: " + account.getBalance());  
我们看到如果返回proxy的话可以对该代理对象进行连续调用

那为什么不返回this,而是返回proxy对象呢?

因为this对象的类型是ExampleInvocationHandler,而不是代理类$Proxy0


除此之外,不返回代理对象的话,还能返回其他信息,如balance。


原创粉丝点击