Что делает солнце.отражать.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
метод может только сообщить вызывающему методу, когда этот метод помечен эта аннотация.