Die Instanz der Anmerkung ist der dynamische Proxy.
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.
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
Was ist Dynamic Proxy überhaupt? Bitte beziehen Sie sich auf das Javadoc von "Proxy" und "InvocationHandler".
Recommended Posts