如何从动态代理中解包原始对象

时间:2010-12-10 13:54:18

标签: java reflection proxy-classes dynamic-proxy

解包动态代理以检索下方原始对象的最佳方法是什么? 已使用java.lang.reflect.Proxy.newProxyInstance()

创建动态代理

谢谢。

3 个答案:

答案 0 :(得分:11)

每个代理都有InvocationHandler与之关联。只有InvocationHandler知道代理所依赖的对象(,如果有的话)。如果您控制代理的创建,那么您可以提供自己的InvocationHandler,它将具有您想要的额外功能(即能够披露基础对象。)如果您不这样做,那么我就是害怕你运气不好。

答案 1 :(得分:11)

没有好的方法:Proxy.getInvocationHandler(proxy)返回处理程序,但问题是从处理程序中提取原始对象。如果你的处理程序是一个匿名类,提取原始对象的唯一方法是使用反射并从名为val $的字段中提取原始东西 - 非常难看的方法。 更好的方法是使用getter创建非匿名处理程序类,然后执行:

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

答案 2 :(得分:2)

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