java中如何获取对象的注解

nic*_*rma 5 java annotations

我正在使用一种逻辑,但我不知道是否可以做到这一点,我想为此使用注释,所以这是我的代码

public class Hola {
    public JSONConverter() {
        String message=  getClass().getAnnotation(HolaAn.class).getMessage();

    }
}


@Target({ElementType.FIELD})
public @interface HolaAn{

    String getMessage();
}




public class MessageTest{

@HolaAn(getMessage= "MUNDO")
private Hola hola;

    @Test
    public void testMessage(){
        hola= new Hola();

    }


}
Run Code Online (Sandbox Code Playgroud)

但是我有 nullPointerException,我不太清楚如何使用我自己的注释,任何人都可以告诉我这是否可能以及如何做到这一点?

Bru*_*sar 6

首先,您需要将注释保留更改为RUNTIME(默认为CLASS),以便可以反射性地读取它们。改成这样:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface HolaAn {

    String message();

}
Run Code Online (Sandbox Code Playgroud)

您正在尝试从类获取注释,但您的注释位于字段上,这是唯一的元素目标。在此示例中,您可以通过以下方式获取注释:

@HolaAn(message = "MUNDO")
private Hola hola;

@Test
public void testMessageOnField() {
    final Field[] fields = HolaTest.class.getDeclaredFields();
    for (final Field field : fields) {
        if (field.isAnnotationPresent(HolaAn.class)) {
            final HolaAn annotation = field.getAnnotation(HolaAn.class);
            Assert.assertTrue(annotation.message().equals("MUNDO"));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果需要从类中获取注释,请将其更改为如下所示:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE})
public @interface HolaAn {

    String message();

}
Run Code Online (Sandbox Code Playgroud)

然后,您可以获得这样的注释消息:

@HolaAn(message = "CLASS")
public class Hola {

    public Hola() {
        final String message = this.getClass().getAnnotation(HolaAn.class).message();
        System.out.println(message);
    }

}

@Test
public void testMessage() {
    hola = new Hola();
}
Run Code Online (Sandbox Code Playgroud)

或者:

@Test
public void testMessageSecondWay() {
    hola = new Hola();
    final Class<?> theClass = hola.getClass();
    if (theClass.isAnnotationPresent(HolaAn.class)) {
        final HolaAn annotation = theClass.getAnnotation(HolaAn.class);
        Assert.assertTrue(annotation.message().equals("CLASS"));
    }
}
Run Code Online (Sandbox Code Playgroud)


Jan*_*Jan 3

您应该将注释更改为

@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@interface HolaAn {
    String getMessage();
}
Run Code Online (Sandbox Code Playgroud)

这是将注释编译到类文件所必需的。

现在您可以通过以下方式访问您的消息:

Field declaredField = new MessageTest().getClass().getDeclaredField(
        "hola");
System.out.println((declaredField.getDeclaredAnnotation(HolaAn.class)
        .getMessage()));
Run Code Online (Sandbox Code Playgroud)