nicearma
nicearma

Reputation: 780

How to get annotation in object java

I'm working in one logic, but i dont know if it is possible to do it, i want to use annotation for this, so this is my code

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

    }


}

But i have nullPointerException, i dont know very well how to work with my own annotation, any one can said me if this is possible and how to do it?

Upvotes: 5

Views: 15195

Answers (2)

Bruno Ribeiro
Bruno Ribeiro

Reputation: 6227

First of all, you need to change annotation retention to RUNTIME (default is CLASS), so they may be read reflectively. Change to like this:

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

    String message();

}

You are trying to get annotation from the class, but your annotation are on a field, the only element target. In this example, you are able to get the annotation in this way:

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

If you need to get the annotation from the class, change it to something like this:

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

    String message();

}

Then, you are able to get annotation message like this:

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

Or:

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

Upvotes: 6

Jan
Jan

Reputation: 1034

You should change your annotation to

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

This is necessary to compile the annotation to the classfile.

Now you can access your message via:

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

Upvotes: 3

Related Questions