2010-12-10 23 views
5

展開動態代理以檢索底下的原始對象的最佳方法是什麼? 動態代理已創建使用java.lang.reflect.Proxy.newProxyInstance()如何從動態代理中展開原始對象

謝謝。

+0

這取決於你如何創建它。哪個庫? JDK代理?或者CGLIB/Javassist? – Bozho 2010-12-10 14:01:50

+0

@Bozho:我已經更新了這個問題,以便更加精確 – MRalwasser 2010-12-10 14:04:14

+0

這假設有一個原始對象。什麼'InvocationHandler'發送到'newProxyInstance()'? – 2010-12-10 14:42:50

回答

8

每個代理都有一個與之關聯的InvocationHandler。只有InvocationHandler知道哪個對象(,如果有)是代理的基礎。如果你控制代理的創建,那麼你可以提供你自己的InvocationHandler,它會有你想要的額外功能(即將能夠透露潛在的對象)。如果你不這樣做,那麼我恐怕你是運氣不好。

1

您可以使用Proxy.getInvocationHandler(proxy)方法來獲取原始的InvocationHandler。

+4

這兩個建議這不是包裝的對象。 – 2012-09-11 00:24:13

8

沒有好的方法:Proxy.getInvocationHandler(proxy)返回處理程序,但問題是從處理程序中提取原始對象。如果您的處理程序是匿名類,則提取原始對象的唯一方法是使用反射並從名爲val $ something的字段中提取原始 - 非常醜陋的方法。 更好的辦法是建立非匿名處理類與getter,那麼你做的:

((YourHandler)Proxy.getInvocationHandler(proxy)).getOriginalObject()