來自: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並不是代理對象,
下面看源代碼
接口:
-
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 {
-
-
-
if ("deposit".equals(method.getName())) {
-
Double value = (Double) args[0];
-
System.out.println("deposit: " + value);
-
balance += value;
-
return proxy;
-
}
-
if ("getBalance".equals(method.getName())) {
-
return balance;
-
}
-
return null;
-
}
-
}
使用:
-
Account account = (Account) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] {Account.class, Serializable.class},
-
new ExampleInvocationHandler());
-
-
-
account.deposit(5000).deposit(4000).deposit(-2500);
-
System.out.println("Balance: " + account.getBalance());
我們看到如果返回proxy的話可以對該代理對象進行連續調用
那爲什麼不返回this,而是返回proxy對象呢?
因爲this對象的類型是ExampleInvocationHandler,而不是代理類$Proxy0
除此之外,不返回代理對象的話,還能返回其他信息,如balance。