有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在java对象中获取注释

我在一个逻辑中工作,但我不知道是否有可能做到这一点,我想使用注释,所以这是我的代码

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

    }


}

但是我有nullPointerException,我不知道如何使用我自己的注释,如果这是可能的,任何人都可以告诉我,以及如何做到这一点


共 (1) 个答案

  1. # 1 楼答案

    首先,需要将注释保留更改为RUNTIME(默认值为CLASS),so they may be read reflectively。换成这样:

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface HolaAn {
    
        String message();
    
    }
    

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

    @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"));
            }
        }
    }
    

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

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

    然后,您可以得到如下注释消息:

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

    或者:

    @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"));
        }
    }