From 62b93916f9dddb8b993d3e1c6c479ef817980b76 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 17 Apr 2020 18:29:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B8=D1=81=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D0=B0=D0=BD=D0=BD=D0=BE=D1=82=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/dmitriymx/reflection/ReflectionField.java | 5 +++++ .../ru/dmitriymx/reflection/ReflectionObject.java | 12 ++++++++++++ .../dmitriymx/reflection/ReflectionObjectTest.java | 14 ++++++++++++++ .../ru/dmitriymx/reflection/SomeAnnotation.java | 12 ++++++++++++ .../java/ru/dmitriymx/reflection/SomeObject.java | 2 ++ 5 files changed, 45 insertions(+) create mode 100644 src/test/java/ru/dmitriymx/reflection/SomeAnnotation.java 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() {