Что подразумевается под @CallerSensitive
аннотацией выше методов?
Например, аннотация присутствует в методе getClassLoader класса
@CallerSensitive
public ClassLoader getClassLoader() {
//
}
Что подразумевается под @CallerSensitive
аннотацией выше методов?
Например, аннотация присутствует в методе 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 заключалась в том, что если чувствительный к вызывающему методу метод вызывался через отражение вместо прямого, должен был быть сложный процесс для определения того, что представляет собой настоящий вызывающий класс. Это было проблематично, если метод был вызван через отражение. Более простой процесс был предложен (и введен) с помощью @CallerSensitive
.
В принципе, аннотация @CallerSensitive
используется JVM
JVM будет отслеживать эту аннотацию и, необязательно, обеспечивать соблюдение что метод
sun.reflect.Reflection.getCallerClass
может только сообщать вызывающему методу, когда этот метод отмечен это аннотация.