java InvocationHandler invoke方法的第一个参数有什么用

 我来答
育知同创教育
2017-11-01 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
展开全部

1. 可以使用反射获取代理对象的信息(也就是proxy.getClass().getName())。

2. 可以将代理对象返回以进行连续调用,这就是proxy存在的目的。因为this并不是代理对象,

下面看源代码

接口:

[java] view plain copy

  • private interface Account {  

  • public Account deposit (double value);  

  • public double getBalance ();  

  • }  


  • Handler:
  • [java] view plain copy

  • 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;  

  • }  

  • }  


  • 使用:
  • [java] view plain copy

  • 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。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式