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方法只能在使用此批注标记该方法时报告方法调用方的不变量。