From a16fed9785333be79395d52f38c65619292f4905 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 17 Apr 2020 18:16:32 +0300 Subject: [PATCH 1/3] =?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=20Getter=20=D0=B8=20Setter=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dmitriymx/reflection/ReflectionField.java | 23 ++++++++++++++++ .../reflection/ReflectionMethod.java | 4 +++ .../reflection/ReflectionObjectTest.java | 26 +++++++++++++++++++ .../ru/dmitriymx/reflection/SomeObject.java | 9 +++++++ 4 files changed, 62 insertions(+) diff --git a/src/main/java/ru/dmitriymx/reflection/ReflectionField.java b/src/main/java/ru/dmitriymx/reflection/ReflectionField.java index 1bcd527..4eeba2b 100644 --- a/src/main/java/ru/dmitriymx/reflection/ReflectionField.java +++ b/src/main/java/ru/dmitriymx/reflection/ReflectionField.java @@ -28,6 +28,10 @@ public class ReflectionField { return field.getName(); } + public Class type() { + return field.getType(); + } + public ReflectionObject get() { try { if (!field.isAccessible()) { @@ -44,6 +48,21 @@ public class ReflectionField { return get().getOriginalObject(clazz); } + public ReflectionMethod getter() { + final String methodName = "get" + formatNameForMethod(); + ReflectionMethod method = new ReflectionObject(object).method(methodName); + if (method.returnType().equals(type())) { + return method; + } else { + return null; + } + } + + public ReflectionMethod setter() { + final String methodName = "set" + formatNameForMethod(); + return new ReflectionObject(object).method(methodName, type()); + } + public boolean isStatic() { return Modifier.isStatic(field.getModifiers()); } @@ -56,4 +75,8 @@ public class ReflectionField { ", isStatic=" + isStatic() + '}'; } + + private String formatNameForMethod() { + return name().substring(0, 1).toUpperCase() + name().substring(1); + } } diff --git a/src/main/java/ru/dmitriymx/reflection/ReflectionMethod.java b/src/main/java/ru/dmitriymx/reflection/ReflectionMethod.java index a6efac2..72e7369 100644 --- a/src/main/java/ru/dmitriymx/reflection/ReflectionMethod.java +++ b/src/main/java/ru/dmitriymx/reflection/ReflectionMethod.java @@ -29,6 +29,10 @@ public class ReflectionMethod { return method.getName(); } + public Class returnType() { + return method.getReturnType(); + } + public boolean isStatic() { return Modifier.isStatic(method.getModifiers()); } diff --git a/src/test/java/ru/dmitriymx/reflection/ReflectionObjectTest.java b/src/test/java/ru/dmitriymx/reflection/ReflectionObjectTest.java index 0a5c2c1..92c36f3 100644 --- a/src/test/java/ru/dmitriymx/reflection/ReflectionObjectTest.java +++ b/src/test/java/ru/dmitriymx/reflection/ReflectionObjectTest.java @@ -30,6 +30,7 @@ public class ReflectionObjectTest { new ReflectionObject(strObj).getOriginalObject(Integer.class); } + //region Field tests @Test public void fieldsList() { final List expectedList = Arrays.asList("finalizedField", "simpleField"); @@ -64,6 +65,30 @@ public class ReflectionObjectTest { refObj.field("field_not_exists"); } + @Test + public void field_getter() { + ReflectionObject refObj = new ReflectionObject(new SomeObject()); + + ReflectionField refField = refObj.field("someIntField"); + assertNotNull(refField); + + ReflectionMethod refGetter = refField.getter(); + assertNotNull(refGetter); + } + + @Test + public void field_setter() { + ReflectionObject refObj = new ReflectionObject(new SomeObject()); + + ReflectionField refField = refObj.field("someIntField"); + assertNotNull(refField); + + ReflectionMethod refSetter = refField.setter(); + assertNotNull(refSetter); + } + //endregion + + //region Method tests @Test public void methodsList() { final List expectedList = Arrays.asList("getSimpleField", "setSimpleField"); @@ -105,4 +130,5 @@ public class ReflectionObjectTest { ReflectionObject refObj = new ReflectionObject(new SomeObject()); refObj.method("not_exists_method"); } + //endregion } \ No newline at end of file diff --git a/src/test/java/ru/dmitriymx/reflection/SomeObject.java b/src/test/java/ru/dmitriymx/reflection/SomeObject.java index 26c2545..393d390 100644 --- a/src/test/java/ru/dmitriymx/reflection/SomeObject.java +++ b/src/test/java/ru/dmitriymx/reflection/SomeObject.java @@ -5,6 +5,7 @@ class SomeObject { private static final int MAGIC_NUMBER = 33; private final String finalizedField = "value123"; private String simpleField = "defaultValue"; + private int someIntField; public String getSimpleField() { return simpleField; @@ -18,6 +19,14 @@ class SomeObject { simpleField = "123value"; } + public int getSomeIntField() { + return someIntField; + } + + public void setSomeIntField(int someIntField) { + this.someIntField = someIntField; + } + public static int getMagicNumber() { return MAGIC_NUMBER; } From 62b93916f9dddb8b993d3e1c6c479ef817980b76 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 17 Apr 2020 18:29:46 +0300 Subject: [PATCH 2/3] =?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() { From aab3b43e57344e7532da984fe6d834306a6a1219 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 17 Apr 2020 18:30:46 +0300 Subject: [PATCH 3/3] update version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 399e53b..f0fc849 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ projectGroup=ru.dmitriymx projectName=reflection-object -projectVersion=1.0-BETA \ No newline at end of file +projectVersion=1.1-BETA \ No newline at end of file