5

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?

3
  • I am not sure, but I think you should do: MessageTest.getClass().getAnnotation(HolaAn.class).getMessage(); Commented Feb 17, 2015 at 13:13
  • @Rubone MessageTest.getClass() ??? Since when is getClass() a static method? Commented Feb 17, 2015 at 13:21
  • sorry... MessageTest.class , my bad. Commented Feb 17, 2015 at 13:23

2 Answers 2

6

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"));
    }
}
Sign up to request clarification or add additional context in comments.

Comments

3

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.