首页 > 学院 > 开发设计 > 正文

InvocationHandler中invoke方法中的第一个参数proxy的用途

2019-11-06 07:57:24
字体:
来源:转载
供稿:网友

最近在研究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。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表