L'instance de l'annotation est le proxy dynamique.
Définissez une annotation comme celle-ci,
package com.example;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface FooBar {
}
Écrivez le code pour écrire Class
à partir de l'instance d'annotation comme ceci,
package com.example;
@FooBar
public class Main {
public static void main(final String[] args) {
final FooBar a = Main.class.getAnnotation(FooBar.class);
System.out.println(a.getClass());
}
}
Quand je l'ai exécuté, j'ai obtenu la sortie suivante:
production
class com.sun.proxy.$Proxy1
Comme vous pouvez le voir (?) Dynamic Proxy.
Si vous suivez Class.getAnnotation
, vous atteindrez ʻAnnotationParser.annotationForMap`.
En regardant le code, vous pouvez voir que le proxy dynamique est créé à l'aide de l'annotation Class
.
/**
* Returns an annotation of the given type backed by the given
* member {@literal ->} value map.
*/
public static Annotation annotationForMap(final Class<? extends Annotation> type,
final Map<String, Object> memberValues)
{
return AccessController.doPrivileged(new PrivilegedAction<Annotation>() {
public Annotation run() {
return (Annotation) Proxy.newProxyInstance(
type.getClassLoader(), new Class<?>[] { type },
new AnnotationInvocationHandler(type, memberValues));
}});
}
L'implémentation ʻInvocationHandler passée lors de la création d'un proxy dynamique est ʻAnnotationInvocationHandler
.
Tous les appels de méthode aux annotations sont gérés par ʻAnnotationInvocationHandler`.
Si vous voulez obtenir ʻAnnotationInvocationHandler à partir d'une instance d'une annotation, utilisez
Proxy.getInvocationHandler`.
final FooBar a = ...
final InvocationHandler h = Proxy.getInvocationHandler(a);
System.out.println(h.getClass());
production
class sun.reflect.annotation.AnnotationInvocationHandler
Qu'est-ce que Dynamic Proxy en premier lieu? Veuillez vous référer au Javadoc de Proxy
et ʻInvocationHandler`.
Recommended Posts