【问题标题】:How to unwrap the original object from a dynamic proxy如何从动态代理中解开原始对象
【发布时间】:2011-05-23 12:10:33
【问题描述】:

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

谢谢。

【问题讨论】:

  • 这取决于您如何创建它。哪个图书馆? JDK代理?还是 CGLIB/Javassist?
  • @Bozho:我已将问题更新为更准确
  • 这假设有一个原始对象。什么InvocationHandler 被发送到newProxyInstance()
  • 我发现this answer on another post 非常有用。此外,这个问题几乎是重复的,最好合并两个恕我直言的建议

标签: java reflection proxy-classes dynamic-proxy


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 那不是被包裹的对象。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-07
      • 1970-01-01
      • 2011-10-10
      • 2023-02-23
      • 2011-10-10
      • 2018-04-23
      • 2012-06-10
      • 2010-10-03
      相关资源
      最近更新 更多