我已阅读以下帖子
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是一种可行的方式。
非常感谢。
答案 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团队知道需要这样的用例。我想维护者正在跟踪这个。