Get list of fields with annotation, by using reflection

JavaReflectionAnnotations

Java Problem Overview


I create my annotation

public @interface MyAnnotation {
}

I put it on fields in my test object

public class TestObject {
	 
	@MyAnnotation 
	final private Outlook outlook;
	@MyAnnotation 
	final private Temperature temperature;
	 ...
}

Now I want to get list of all fields with MyAnnotation.

for(Field field  : TestObject.class.getDeclaredFields())
{
	if (field.isAnnotationPresent(MyAnnotation.class))
		{
	          //do action
		}
}

But seems like my block do action is never executed, and fields has no annotation as the following code returns 0.

TestObject.class.getDeclaredField("outlook").getAnnotations().length;

Is anyone can help me and tell me what i'm doing wrong?

Java Solutions


Solution 1 - Java

You need to mark the annotation as being available at runtime. Add the following to your annotation code.

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}

Solution 2 - Java

/**
 * @return null safe set
 */
public static Set<Field> findFields(Class<?> classs, Class<? extends Annotation> ann) {
    Set<Field> set = new HashSet<>();
    Class<?> c = classs;
    while (c != null) {
        for (Field field : c.getDeclaredFields()) {
            if (field.isAnnotationPresent(ann)) {
                set.add(field);
            }
        }
        c = c.getSuperclass();
    }
    return set;
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser902383View Question on Stackoverflow
Solution 1 - JavaZuttyView Answer on Stackoverflow
Solution 2 - JavaMindaugas K.View Answer on Stackoverflow