¿Cómo conseguir la anotación por encima de la anotación

Peng:

Añadí una anotación para el método, y hay otras anotaciones en esta anotación. Cuando intento para conseguir la anotación anterior por el método, por desgracia, el retorno es siempre nula. ¿Quiero saber por qué?

Este es el método que se define

@ApiTest
public void add() {
}

Esta es la anotación he definido.

@ValueName("hello word")
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ApiTest {

}
////////////////////////////////////////////////////////
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ValueName {
  String value() default "";
}

El resultado siempre devuelve un valor nulo cuando trato de conseguir @ValueName

Class<?> testApi = Class.forName("com.huawei.netty.TestApi");
    Method add = testApi.getMethod("add", null);
    ApiTest apiTest = add.getDeclaredAnnotation(ApiTest.class);
    ValueName valueName = apiTest.getClass().getDeclaredAnnotation(ValueName.class);
    if (valueName != null) {
      System.out.println(valueName.annotationType());
    }

Pero de esta manera se puede obtener

Class<?> apiTest = Class.forName("com.huawei.netty.ApiTest");
    ValueName valueName = apiTest.getDeclaredAnnotation(ValueName.class);
    if (valueName != null) {
      System.out.println(valueName.value());
    }

¿Puedo saber qué es esto?

repollo:

Usted debe utilizar Annotation#annotationType()para conseguir la clase de la instancia de anotación, en lugar de Object#getClass(). El último método no devuelve la clase que usted piensa que es. Intente lo siguiente:

MetaAnnotation.java

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface MetaAnnotation {

    String value();

}

CustomAnnotation.java

@MetaAnnotation("Hello, World!")
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface CustomAnnotation {}

Main.java

@CustomAnnotation
public final class Main {

    public static void main(String[] args) {
        CustomAnnotation ca = Main.class.getAnnotation(CustomAnnotation.class);
        MetaAnnotation   ma = ca.annotationType().getAnnotation(MetaAnnotation.class);

        System.out.println("CustomAnnotation#getClass()       = " + ca.getClass());
        System.out.println("CustomAnnotation#annotationType() = " + ca.annotationType());
        System.out.println("MetaAnnotation#value()            = " + ma.value());
    }

}

Cuando ejecuto el anterior utilizando OpenJDK 12.0.1, me sale el siguiente resultado:

CustomAnnotation#getClass()       = class com.sun.proxy.$Proxy1
CustomAnnotation#annotationType() = interface CustomAnnotation
MetaAnnotation#value()            = Hello, World!

Como se puede ver, la clase de la anotación ejemplo es una clase de proxy que no tendría la anotación que está consultando a.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=336347&siteId=1
Recomendado
Clasificación