sun.reflect.CallerSensitive注释是什么意思?

Kum*_*nav 32 java security reflection class classloader

@CallerSensitive上述方法的注释隐含了什么?

例如,注释存在于Class的getClassLoader方法中

 @CallerSensitive
    public ClassLoader getClassLoader() {
    //
    }
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 46

根据我在评论中链接的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()));
}
Run Code Online (Sandbox Code Playgroud)

,你注意到它正在使用Reflection.getCallerClass().如果我们看一下这种方法

返回调用此方法的方法的调用者的类,忽略与其关联的框架java.lang.reflect.Method.invoke()及其实现.

@CallerSensitive
public static native Class getCallerClass();
Run Code Online (Sandbox Code Playgroud)

在这个JEP之前,问题似乎是如果调用者敏感方法是通过反射而不是直接调用的,那么必须有一个复杂的过程来识别实际的调用类是什么.如果通过反射调用该方法,则会出现问题.提出(并介绍)一个更简单的过程@CallerSensitive.

基本上,@CallerSensitive注释由JVM使用

JVM将跟踪此批注,并且可选地强制执行该sun.reflect.Reflection.getCallerClass方法只能在使用此批注标记该方法时报告方法调用方的不变量.

  • @Boosha它几乎只适用于JVM.注意它所属的包是`sun.reflect.***`.这不是JDK中提供的软件包.我在回答中链接到的JEP表示,除其他外,它还有安全性改进,有助于更好地管理呼叫者. (6认同)
  • 我非常惊讶地看到这个sun-internal API泄漏到了JDK的公共API中.为什么不是`java.lang.reflect.CallerSensitive`注释? (3认同)