How to access fields defined in custom annotations in Java

annotations, java, reflection

Solution

By default, annotations aren't available at runtime. You need to add `@Retention(RetentionPolicy.RUNTIME)` to your annotation definition to make it available for runtime processing. For example:

@Retention(RetentionPolicy.RUNTIME)
public @interface Size {

In practice, you should also check whether or not the field actually has a given annotation with `Field.isAnnotationPresent` before actually trying to get the annotation off of the field.

Also, it's also good practice to specify what types of elements your annotation belongs on with `@Target`. So your example would then be:

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

Problem

I have the following Java code - ``` import java.lang.reflect.Field; public class AnnotationTest { public @interface Size { int size(); int location(); } @Size(size = 40, location = 85) private String firstName; @Size(size = 1, location = 21) private String middleInitial; @Size(size = 50, location = 115) private String lastName; public static void main(String[] args) { AnnotationTest t = new AnnotationTest(); Class<? extends AnnotationTest> classInstance = t.getClass(); for (Field f : classInstance.getDeclaredFields()) { Size s = f.getAnnotation(Size.class); int size = s.size(); // this is line 29 int location = s.location(); System.out.println("size = "+ size); System.out.println("location = "+location); } } } ``` The error I get is ``` Exception in thread "main" java.lang.NullPointerException at com.stackoverflowx.AnnotationTest.main(Demo.java:125 ``` How to access the annotation fields correctly?

Original source