java class reflection classloader

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.