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 diff --git a/src/main/java/ru/dmitriymx/reflection/ReflectionField.java b/src/main/java/ru/dmitriymx/reflection/ReflectionField.java index 1bcd527..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; @@ -28,6 +29,10 @@ public class ReflectionField { return field.getName(); } + public Class type() { + return field.getType(); + } + public ReflectionObject get() { try { if (!field.isAccessible()) { @@ -44,10 +49,29 @@ 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()); } + public T annotation(Class annotationType) { + return field.getAnnotation(annotationType); + } + @Override public String toString() { return "ReflectionField{" + @@ -56,4 +80,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/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 0a5c2c1..b396217 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,44 @@ 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); + } + + @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 @Test public void methodsList() { final List expectedList = Arrays.asList("getSimpleField", "setSimpleField"); @@ -105,4 +144,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/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 26c2545..3becadf 100644 --- a/src/test/java/ru/dmitriymx/reflection/SomeObject.java +++ b/src/test/java/ru/dmitriymx/reflection/SomeObject.java @@ -6,6 +6,9 @@ class SomeObject { private final String finalizedField = "value123"; private String simpleField = "defaultValue"; + @SomeAnnotation + private int someIntField; + public String getSimpleField() { return simpleField; } @@ -18,6 +21,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; }