[JAVA] Eine Instanz der Annotation ist Dynamic Proxy

Die Instanz der Anmerkung ist der dynamische Proxy.

Ich werde überprüfen

Definieren Sie eine Annotation wie folgt:

package com.example;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface FooBar {
}

Schreiben Sie den Code, um "Klasse" aus der Annotationsinstanz wie folgt zu schreiben:

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());
    }
}

Als ich es ausführte, erhielt ich die folgende Ausgabe:

Ausgabe


class com.sun.proxy.$Proxy1

Wie Sie sehen können (?) Dynamic Proxy.

Wo wird der dynamische Proxy hergestellt?

Wenn Sie "Class.getAnnotation" folgen, erreichen Sie "AnnotationParser.annotationForMap".

Wenn Sie sich den Code ansehen, können Sie sehen, dass der dynamische Proxy mit der Anmerkung "Klasse" erstellt wird.

    /**
     * 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));
            }});
    }

Die beim Erstellen eines dynamischen Proxys übergebene Implementierung "InvocationHandler" lautet "AnnotationInvocationHandler". Alle Methodenaufrufe von Annotationen werden von "AnnotationInvocationHandler" verarbeitet.

Verwenden Sie Proxy.getInvocationHandler, wenn SieAnnotationInvocationHandler von einer Instanz einer Annotation erhalten möchten.

final FooBar a = ...
final InvocationHandler h = Proxy.getInvocationHandler(a);
System.out.println(h.getClass());

Ausgabe


class sun.reflect.annotation.AnnotationInvocationHandler

Zusatzinformationen

Was ist Dynamic Proxy überhaupt? Bitte beziehen Sie sich auf das Javadoc von "Proxy" und "InvocationHandler".

Recommended Posts

Eine Instanz der Annotation ist Dynamic Proxy
Java Dynamic Proxy
Was ist Spring Tools 4?
Was ist eine Anmerkung?
Spring Boot zum Lernen von Anmerkungen
Eine Instanz der Annotation ist Dynamic Proxy
Was ist Instanzsteuerung?
Was ist eine Anmerkung?
Was ist @ (Instanzvariable)?
[Ruby] Was ist eine Instanz?