
org.sfm.reflect.ObjectGetterFactory Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of sfm Show documentation
Show all versions of sfm Show documentation
Java library to map flat record - ResultSet, csv - to java object with minimum configuration and low footprint.
package org.sfm.reflect;
import org.sfm.reflect.asm.AsmFactory;
import org.sfm.reflect.impl.FieldGetter;
import org.sfm.reflect.impl.MethodGetter;
import org.sfm.reflect.primitive.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
/**
*
*/
public final class ObjectGetterFactory {
private final AsmFactory asmFactory;
public ObjectGetterFactory(AsmFactory asmFactory) {
this.asmFactory = asmFactory;
}
public Getter getGetter(final Class super T> target, final String property) {
// first look for method
final Method method = lookForMethod(target, property);
final Getter getter;
if (method == null) {
getter = getFieldGetter(target, property);
} else {
getter = getMethodGetter(method);
}
return getter;
}
public Getter getMethodGetter(final Method method) {
boolean accessible = Modifier.isPublic(method.getModifiers()) && Modifier.isPublic(method.getDeclaringClass().getModifiers());
if (asmFactory != null && accessible) {
try {
return asmFactory.createGetter(method);
} catch(Throwable e) {
// ignore
}
}
if (!accessible) {
method.setAccessible(true);
}
return new MethodGetter(method);
}
public Getter getFieldGetter(final Class> target, final String property) {
// look for field
final Field field = lookForField(target, property);
if (field != null) {
return getFieldGetter(field);
} else {
return null;
}
}
public Getter getFieldGetter(Field field) {
boolean accessible = Modifier.isPublic(field.getModifiers()) && Modifier.isPublic(field.getDeclaringClass().getModifiers());
if (asmFactory != null && accessible) {
try {
return asmFactory.createGetter(field);
} catch(Throwable e) {}
}
if (!accessible) {
field.setAccessible(true);
}
return new FieldGetter(field);
}
private Method lookForMethod(final Class> target, final String property) {
if (target == null) return null;
for(Method m : target.getDeclaredMethods()) {
if(GetterHelper.isPublicMember(m.getModifiers())
&& GetterHelper.methodNameMatchesProperty(m.getName(), property)) {
return m;
}
}
if (!Object.class.equals(target)) {
return lookForMethod(target.getSuperclass(), property);
}
return null;
}
private Field lookForField(final Class> target, final String property) {
if (target == null) return null;
for(Field field : target.getDeclaredFields()) {
if(GetterHelper.fieldModifiersMatches(field.getModifiers())
&& GetterHelper.fieldNameMatchesProperty(field.getName(), property)) {
return field;
}
}
return lookForField(target.getSuperclass(), property);
}
@SuppressWarnings("unchecked")
public static BooleanGetter toBooleanGetter(final Getter super T, ? extends P> getter) {
if (getter instanceof BooleanGetter) {
return (BooleanGetter) getter;
} else {
return new BoxedBooleanGetter((Getter super T, Boolean>) getter);
}
}
@SuppressWarnings("unchecked")
public static IntGetter toIntGetter(Getter super T, ? extends P> getter) {
if (getter instanceof IntGetter) {
return (IntGetter) getter;
} else {
return new BoxedIntGetter((Getter super T, Integer>) getter);
}
}
@SuppressWarnings("unchecked")
public static LongGetter toLongGetter(Getter super T, ? extends P> getter) {
if (getter instanceof LongGetter) {
return (LongGetter) getter;
} else {
return new BoxedLongGetter((Getter super T, Long>) getter);
}
}
@SuppressWarnings("unchecked")
public static FloatGetter toFloatGetter(Getter super T, ? extends P> getter) {
if (getter instanceof FloatGetter) {
return (FloatGetter) getter;
} else {
return new BoxedFloatGetter((Getter super T, Float>) getter);
}
}
@SuppressWarnings("unchecked")
public static DoubleGetter toDoubleGetter(Getter super T, ? extends P> getter) {
if (getter instanceof DoubleGetter) {
return (DoubleGetter) getter;
} else {
return new BoxedDoubleGetter((Getter super T, Double>) getter);
}
}
@SuppressWarnings("unchecked")
public static ByteGetter toByteGetter(Getter super T, ? extends P> getter) {
if (getter instanceof ByteGetter) {
return (ByteGetter) getter;
} else {
return new BoxedByteGetter((Getter super T, Byte>) getter);
}
}
@SuppressWarnings("unchecked")
public static ShortGetter toShortGetter(Getter super T, ? extends P> getter) {
if (getter instanceof ShortGetter) {
return (ShortGetter) getter;
} else {
return new BoxedShortGetter((Getter super T, Short>) getter);
}
}
@SuppressWarnings("unchecked")
public static CharacterGetter toCharGetter(Getter super T, ? extends P> getter) {
if (getter instanceof CharacterGetter) {
return (CharacterGetter) getter;
} else {
return new BoxedCharacterGetter((Getter super T, Character>) getter);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy