【问题标题】:Java 7u40 Java SE 8 sun.reflect.Reflection.getCallerClass [closed]Java 7u40 Java SE 8 sun.reflect.Reflection.getCallerClass [关闭]
【发布时间】:2013-07-14 14:01:19
【问题描述】:

我已阅读以下帖子

Oracle Discontinuing 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 是一种方法。

非常感谢。

【问题讨论】:

    标签: java reflection java-8


    【解决方案1】:

    简短回答:您只需要担心使用 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 团队了解需要这样做的用例。我想维护人员正在跟踪这个。

    【讨论】:

    • 为什么这个问题被否决了?这是一个未来感兴趣的问题。我有点担心,因为实际上我使用反射。
    • 冷静!认为反射被完全删除是愚蠢的。
    • 这与他们将 this 关键字更改为 self 的可能性差不多 :-)
    • 呃!我正要使用这个方法...现在我必须implement it myself
    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多