sun.reflect.CallerSensitive注释是什么意思?
@CallerSensitive
注释在上面的方法中隐含了什么?
例如,注释存在于Class的getClassLoader方法中
@CallerSensitive public ClassLoader getClassLoader() { // }
根据我在评论中链接的JEP(也在这里 ),
调用者敏感方法根据其直接调用者的类别改变其行为。 它通过调用
sun.reflect.Reflection.getCallerClass
方法发现其调用者的类。
如果你看一下Class#forName(String)
@CallerSensitive public static Class> forName(String className) throws ClassNotFoundException { return forName0(className, true, ClassLoader.getClassLoader(Reflection.getCallerClass())); }
,您注意到它正在使用Reflection.getCallerClass()
。 如果我们看一下这种方法
返回调用此方法的方法的调用者的类,忽略与
java.lang.reflect.Method.invoke()
关联的框架及其实现。
@CallerSensitive public static native Class getCallerClass();
在这个JEP之前,问题似乎是如果调用者敏感方法是通过reflection而不是直接调用的,那么必须有一个复杂的过程来识别实际的调用类是什么。 如果通过reflection调用该方法,则会出现问题。 使用@CallerSensitive
提出(并引入)了一个更简单的过程。
基本上,JVM使用@CallerSensitive
注释
JVM将跟踪此批注,并可选择强制执行
sun.reflect.Reflection.getCallerClass
方法只能在使用此批注标记该方法时报告方法调用方的不变量。