4

我已阅读以下帖子

Oracle 停止 sun.reflect.Reflection.getCallerClass

我想知道这种变化的真正含义。

1)。意味着这个类 sun.reflect.Reflection.getCallerClass 将被重写以提供更多的安全性Java reflection

2)。意味着不再需要这个类?也许另一种方法?

3)。反射将在 Java 8 中结束。method.invoke 将抛出 UnsupportedOperationException。??

4)。这会影响与 Spring 或 AspectJ Aspect Oriented Programming 相关的任何内容吗?

我想知道,因为我们使用反射method.invoke在发送到数据库之前为类提供一些标志。这引发了另一个问题,如果反思是关于我可以使用什么方法来提供我的上述行为。我认为AOP是一种方法。

多谢。

4

1 回答 1

10

简短的回答:您只需要担心使用 sun.reflect.Reflection.getCallerClass. (并且建议撤消 Java 反射是可笑的。)

更长的答案是,该方法提供的功能正在 JEP 176 中重新设计。旧方法实际上正在被删除......不仅仅是被弃用。它是sun.*树中的一个方法,应用程序代码不应直接调用它。目前的计划似乎是:

  • 如果无法识别有效用例,则完全删除此功能,或

  • 提供替代 API,或至少推迟从 Java 7 硬删除当前方法


这个私有 API 最初的主要用例是用于需要知道谁调用它们的安全管理员等。不幸的是,这种方法已被证明是脆弱的。已经设计了一种解决该问题的新方法(使用消息句柄)。他们决定强行解决这个问题,而不是保留这个 API 以供应用程序代码随意使用。

然而,有迹象表明这个问题有回击的迹象,因为它会导致 Groovy 和 JRuby 之类的东西出现问题。

参考:


您的具体问题:

1)。意味着这个类 sun.reflect.Reflection.getCallerClass 将被重写以在 Java 反射中提供更多的安全性?

看上面。我怀疑这有与安全相关的动机。

更新- 这证实了这一点:https ://partners.immunityinc.com/idocs/Java%20MBeanInstantiator.findClass%200day%20Analysis.pdf

2)。意味着不再需要这个类?也许另一种方法?

看上面。他们尚未确定是否需要该功能。

3)。反射将在 Java 8 中结束。method.invoke 将抛出 UnsupportedOperationException。??

对这两个都不行。这只是sun.*包中特定类的特定方法。

它一般不会影响反射或对method.invoke().

4)。这会影响与 Spring 或 AspectJ Aspect Oriented Programming 相关的任何内容吗?

可能不是。如果它们依赖于特定的方法,它只会影响这些技术。如果他们这样做了,那么相应的库维护人员将需要确保 Java 团队了解需要这样做的用例。我想维护人员正在跟踪这一点。

于 2013-07-14T14:26:56.277 回答