java - ¿Qué significa sun.reflect.CallerSensitive annotation?
class reflection (1)
¿Qué implica la anotación @CallerSensitive
sobre los métodos?
Por ejemplo, la anotación está presente en el método getClassLoader de Class
@CallerSensitive
public ClassLoader getClassLoader() {
//
}
De acuerdo con el JEP vinculado a en los comentarios (también here ),
Un método sensible a las llamadas varía su comportamiento de acuerdo con la clase de su llamador inmediato. Descubre la clase de su interlocutor invocando el método
sun.reflect.Reflection.getCallerClass
.
Si nos fijamos en la implementación de Class#forName(String)
@CallerSensitive
public static Class<?> forName(String className)
throws ClassNotFoundException {
return forName0(className, true,
ClassLoader.getClassLoader(Reflection.getCallerClass()));
}
, observa que está utilizando Reflection.getCallerClass()
. Si miramos ese método
Devuelve la clase del llamante del método que llama a este método, ignorando los marcos asociados con
java.lang.reflect.Method.invoke()
y su implementación.
@CallerSensitive
public static native Class getCallerClass();
El problema, parece, antes de este JEP, era que si se llamaba el método sensible al llamante a través de la reflexión en lugar de directamente, tenía que haber un proceso complejo para identificar cuál era la clase de llamada real. Esto fue problemático si el método fue invocado a través de la reflexión. Se propuso (e introdujo) un proceso más simple con @CallerSensitive
.
Básicamente, la @CallerSensitive
utiliza la anotación @CallerSensitive
La JVM rastreará esta anotación y, opcionalmente, hará cumplir la invariante de que el método
sun.reflect.Reflection.getCallerClass
solo puede informar la persona que llama de un método cuando ese método está marcado con esta anotación.