为什么不建议调用sun包,如何通过其他方法确定调用者

 我来答
就烦条0o
推荐于2018-05-04 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46492
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
查看getCallerClass的 底层实现 #668可以发现,当传入了depth的时候,调用了net.reflect.Reflection类的这个方法:
@java.lang.Deprecated
public static native java.lang.Class getCallerClass(int arg0);

这个方法在底层实现中还是通过兼容旧版本的代码去执行的,所以这个方法加了一个 @Deprecated 注解,这也是为什么不推荐上面那种方法获取调用者类型的原因。

类似的, JDK8 中的 @java.lang.Class 的 forName(className) 方法也加了这个注解,因为forName方法里面也调用给到了Reflection.getCallerClass()
Oracle建议开发人员不要使用sun包,但是有一系列的项目都依赖于getCallerClass()方法,如Jigsaw和Lambda,Intellij IDEA。在spring-loaded的源码这里也调用了getCallerClass()方法,作为临时的方案去兼容JDK 7u25,需要添加系统属性:jdk.reflect.allowGetCallerClass
其实查看JDK 7 Reflection的字节码可以发现对这个属性的处理逻辑:
public static java.lang.Class getCallerClass(int arg0);
0 invokestatic sun.misc.VM.allowGetCallerClass() : boolean [216]
3 ifeq 13
6 iload_0 [arg0]
7 iconst_1
8 iadd
9 invokestatic sun.reflect.Reflection.getCallerClass0(int) : java.lang.Class [217]
12 areturn
13 new java.lang.UnsupportedOperationException [112]
16 dup
17 ldc <String "This method has been disabled by a system property"> [7]
19 invokespecial java.lang.UnsupportedOperationException(java.lang.String) [206]
22 athrow
Line numbers:
[pc: 0, line: 68]
[pc: 6, line: 69]
[pc: 13, line: 71]
Stack map table: number of frames 1
[pc: 13, same]
开发者不应该调用sun包,Oracle一直在提醒开发者,调用
sun.*包里面的方法是危险的。上面用到的Reflection.getCallerClass()也是在这个包里面的,因为sun包并不包含在
Java平台的标准中,它与操作系统相关,在不同的操作系统如Solaris,Windows,Linux,Mac等中的实现也各不相同,并且可能随着
JDK版本而变化。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式