Java 7u40 Java SE 8 sun.reflect.Reflection.getCallerClass

时间:2013-07-14 14:01:19

标签: java reflection java-8

我已阅读以下帖子

Oracle Discontinuing sun.reflect.Reflection.getCallerClass

我想知道这种变化究竟意味着什么。

1)。意味着将重写此类sun.reflect.Reflection.getCallerClass以在Java reflection中提供更高的安全性?

2)。意味着不再需要这门课程?也许是另一种方法?

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

4)。这会影响与Spring或AspectJ面向方面编程有关的任何事情吗?

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

非常感谢。

1 个答案:

答案 0 :(得分:8)

简短回答:您只需要担心使用 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面向方面编程有关的任何事情吗?

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