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

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

谢谢。

每个代理都有一个与之关联的InvocationHandler 。 只有InvocationHandler知道代理所依赖的对象( 如果有 )。 如果你控制代理的创建,那么你可以提供你自己的InvocationHandler ,它将具有你想要的额外function(即能够透露底层对象。)如果你没有,那么我恐怕你是运气不好。

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

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

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