Что делает солнце.отражать.CallerSensitive имею в виду аннотацию?

что подразумевается @CallerSensitive аннотации выше методов?

например, аннотация присутствует в методе getClassLoader класса

 @CallerSensitive
    public ClassLoader getClassLoader() {
    //
    }

1 ответов


согласно JEP, с которым я связан в комментариях (также здесь),

чувствительный к вызывающему метод меняет свое поведение в зависимости от класса его непосредственного вызывающего. Он обнаруживает класс вызывающего объекта, вызывая the 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, заключалась в том, что если вызывающий чувствительный метод вызывался через отражение, а не напрямую, должен был быть сложный процесс для идентификации фактического вызывающего класса. Это было проблематично, если метод вызывался через отражение. Был предложен более простой процесс (и введено) с @CallerSensitive.

в основном @CallerSensitive аннотация используется JVM

JVM будет отслеживать эту аннотацию и, необязательно, применять инвариант, что sun.reflect.Reflection.getCallerClass метод может только сообщить вызывающему методу, когда этот метод помечен эта аннотация.