Подтвердить что ты не робот

Что означает sun.reflect.CallerSensitive аннотация означает?

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

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

 @CallerSensitive
    public ClassLoader getClassLoader() {
    //
    }
4b9b3361

Ответ 1

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

В принципе, аннотация @CallerSensitive используется JVM

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