11

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

谢谢你。

4

3 回答 3

16

没有好的方法:Proxy.getInvocationHandler(proxy) 返回handler,但问题是从handler中提取原始对象。如果您的处理程序是匿名类,则提取原始对象的唯一方法是使用反射并从名为 val$something 的字段中提取原始对象 - 非常丑陋的方法。更好的方法是使用 getter 创建非匿名处理程序类,然后执行以下操作:

((YourHandler)Proxy.getInvocationHandler(proxy)).getOriginalObject()
于 2010-12-10T14:38:54.907 回答
14

每个代理都有一个InvocationHandler与之关联的。只有InvocationHandler知道哪个对象(如果有)是代理的基础。如果您控制代理的创建,那么您可以提供自己的代理,该代理InvocationHandler将具有您想要的额外功能(即能够公开底层对象。)如果您不这样做,那么我担心您出局了运气。

于 2010-12-10T14:03:04.833 回答
0

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

于 2010-12-10T14:16:04.043 回答