[JAVA] Une instance de l'annotation est Dynamic Proxy

L'instance de l'annotation est le proxy dynamique.

je vérifierai

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.

Où est fabriqué le proxy dynamique?

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

Information supplémentaire

Qu'est-ce que Dynamic Proxy en premier lieu? Veuillez vous référer au Javadoc de Proxy et ʻInvocationHandler`.

Recommended Posts

Une instance de l'annotation est Dynamic Proxy
Proxy dynamique Java
Qu'est-ce que Spring Tools 4
Qu'est-ce qu'une annotation?
Spring Boot pour l'apprentissage des annotations
Une instance de l'annotation est Dynamic Proxy
Qu'est-ce que le contrôle d'instance?
Qu'est-ce qu'une annotation?
Qu'est-ce que @ (variable d'instance)?
[Ruby] Qu'est-ce qu'une instance?