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?
The only way we have to get only inherited fields is to use the getDeclaredFields() method, as we just did, and filter its results using the Field::getModifiers method. This one returns an int representing the modifiers of the current field. Each possible modifier is assigned a power of two between 2^0 and 2^7.
Annotations are a kind of comment or meta data you can insert in your Java code. These annotations can then be processed at compile time by pre-compiler tools, or at runtime via Java Reflection. Here is an example of class annotation: @MyAnnotation(name="someName", value = "Hello World") public class TheClass { }
Annotations, just like methods or fields, can be inherited between class hierarchies. If an annotation declaration is marked with @Inherited , then a class that extends another class with this annotation can inherit it. The annotation can be overridden in case the child class has the annotation.
You need to mark the annotation as being available at runtime. Add the following to your annotation code.
@Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { }
/** * @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; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With