package ru.dmitriymx.reflection; import lombok.EqualsAndHashCode; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @EqualsAndHashCode public class ReflectionField { private final Object object; private final Class clazz; private final Field field; public ReflectionField(Object object, Field field) { this.object = object; this.clazz = object.getClass(); this.field = field; } public ReflectionField(Class clazz, Field field) { this.object = null; this.clazz = clazz; this.field = field; } public String name() { return field.getName(); } public Class type() { return field.getType(); } public ReflectionObject get() { try { if (!field.isAccessible()) { field.setAccessible(true); } return new ReflectionObject(field.get(object)); } catch (IllegalAccessException e) { throw new ReflectionException(e); } } public T get(Class clazz) { 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{" + "objectClass=" + clazz + ", fieldName=" + field.getName() + ", isStatic=" + isStatic() + '}'; } private String formatNameForMethod() { return name().substring(0, 1).toUpperCase() + name().substring(1); } }