diff --git a/src/main/java/ru/dmitriymx/reflection/ReflectionField.java b/src/main/java/ru/dmitriymx/reflection/ReflectionField.java index 4eeba2b..fc3c74b 100644 --- a/src/main/java/ru/dmitriymx/reflection/ReflectionField.java +++ b/src/main/java/ru/dmitriymx/reflection/ReflectionField.java @@ -2,6 +2,7 @@ package ru.dmitriymx.reflection; import lombok.EqualsAndHashCode; +import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @@ -67,6 +68,10 @@ public class ReflectionField { return Modifier.isStatic(field.getModifiers()); } + public T annotation(Class annotationType) { + return field.getAnnotation(annotationType); + } + @Override public String toString() { return "ReflectionField{" + diff --git a/src/main/java/ru/dmitriymx/reflection/ReflectionObject.java b/src/main/java/ru/dmitriymx/reflection/ReflectionObject.java index ded8434..51d01a1 100644 --- a/src/main/java/ru/dmitriymx/reflection/ReflectionObject.java +++ b/src/main/java/ru/dmitriymx/reflection/ReflectionObject.java @@ -2,11 +2,14 @@ package ru.dmitriymx.reflection; import lombok.ToString; +import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; @ToString public class ReflectionObject { @@ -45,6 +48,15 @@ public class ReflectionObject { } } + public List fieldsWithAnnotation(final Class annotationType) { + final Class clazz = object.getClass(); + + return Stream.of(clazz.getDeclaredFields()) + .filter(field -> field.isAnnotationPresent(annotationType)) + .map(field -> new ReflectionField(object, field)) + .collect(Collectors.toList()); + } + public ReflectionField field(String name) { final Class clazz = object.getClass(); diff --git a/src/test/java/ru/dmitriymx/reflection/ReflectionObjectTest.java b/src/test/java/ru/dmitriymx/reflection/ReflectionObjectTest.java index 92c36f3..b396217 100644 --- a/src/test/java/ru/dmitriymx/reflection/ReflectionObjectTest.java +++ b/src/test/java/ru/dmitriymx/reflection/ReflectionObjectTest.java @@ -86,6 +86,20 @@ public class ReflectionObjectTest { ReflectionMethod refSetter = refField.setter(); assertNotNull(refSetter); } + + @Test + public void fieldsWithAnnotation() { + ReflectionObject refObj = new ReflectionObject(new SomeObject()); + + List list = refObj.fieldsWithAnnotation(SomeAnnotation.class); + assertEquals(1, list.size()); + + ReflectionField refField = list.get(0); + assertEquals("someIntField", refField.name()); + + SomeAnnotation annotation = refField.annotation(SomeAnnotation.class); + assertNotNull(annotation); + } //endregion //region Method tests diff --git a/src/test/java/ru/dmitriymx/reflection/SomeAnnotation.java b/src/test/java/ru/dmitriymx/reflection/SomeAnnotation.java new file mode 100644 index 0000000..1878b16 --- /dev/null +++ b/src/test/java/ru/dmitriymx/reflection/SomeAnnotation.java @@ -0,0 +1,12 @@ +package ru.dmitriymx.reflection; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface SomeAnnotation { + +} diff --git a/src/test/java/ru/dmitriymx/reflection/SomeObject.java b/src/test/java/ru/dmitriymx/reflection/SomeObject.java index 393d390..3becadf 100644 --- a/src/test/java/ru/dmitriymx/reflection/SomeObject.java +++ b/src/test/java/ru/dmitriymx/reflection/SomeObject.java @@ -5,6 +5,8 @@ class SomeObject { private static final int MAGIC_NUMBER = 33; private final String finalizedField = "value123"; private String simpleField = "defaultValue"; + + @SomeAnnotation private int someIntField; public String getSimpleField() {