
org.sfm.reflect.ObjectSetterFactory Maven / Gradle / Ivy
Show all versions of simpleFlatMapper Show documentation
package org.sfm.reflect;
import org.sfm.reflect.asm.AsmFactory;
import org.sfm.reflect.impl.FieldSetter;
import org.sfm.reflect.impl.MethodSetter;
import org.sfm.reflect.impl.NullSetter;
import org.sfm.reflect.primitive.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
/**
*
*/
public final class ObjectSetterFactory {
private final AsmFactory asmFactory;
public ObjectSetterFactory(final AsmFactory asmFactory) {
this.asmFactory = asmFactory;
}
/**
*
* @param target
* @param property
* @param
* @param
* @return
*/
public Setter getSetter(final Class extends T> target, final String property) {
// first look for method
final Method method = lookForMethod(target, property);
final Setter setter;
if (method == null) {
setter = getFieldSetter(target, property);
} else {
setter = getMethodSetter(method);
}
return setter;
}
/**
*
* @param method
* @param
* @param
* @return
*/
public Setter getMethodSetter(final Method method) {
if (asmFactory != null) {
try {
return asmFactory.createSetter(method);
} catch(Exception e) {
// ignore
}
}
return new MethodSetter(method);
}
public Setter getFieldSetter(final Class> target, final String property) {
// look for field
final Field field = lookForField(target, property);
if (field != null) {
return getFieldSetter(field);
} else {
return null;
}
}
private Setter getFieldSetter(Field field) {
if (asmFactory != null && Modifier.isPublic(field.getModifiers())) {
try {
return asmFactory.createSetter(field);
} catch(Exception e) {
}
}
if (!Modifier.isPublic(field.getModifiers())) {
field.setAccessible(true);
}
return new FieldSetter(field);
}
private Method lookForMethod(final Class> target, final String property) {
if (target == null) return null;
for(Method m : target.getDeclaredMethods()) {
if(SetterHelper.methodModifiersMatches(m.getModifiers())
&& SetterHelper.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(SetterHelper.fieldModifiersMatches(field.getModifiers())
&& SetterHelper.fieldNameMatchesProperty(field.getName(), property)) {
return field;
}
}
if (!Object.class.equals(target)) {
return lookForField(target.getSuperclass(), property);
}
return null;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static BooleanSetter toBooleanSetter(final Setter setter) {
if (isNullSetter(setter)) {
return null;
} else if (setter instanceof BooleanSetter) {
return (BooleanSetter) setter;
} else if (setter instanceof MethodSetter) {
return new BooleanMethodSetter(((MethodSetter) setter).getMethod());
} else if (setter instanceof FieldSetter) {
return new BooleanFieldSetter(((FieldSetter) setter).getField());
} else {
throw new IllegalArgumentException("Invalid type " + setter);
}
}
private static boolean isNullSetter(Setter, ?> setter) {
return setter == null || setter instanceof NullSetter;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static ByteSetter toByteSetter(final Setter setter) {
if (isNullSetter(setter)) {
return null;
} else if (setter instanceof ByteSetter) {
return (ByteSetter) setter;
} else if (setter instanceof MethodSetter) {
return new ByteMethodSetter(((MethodSetter) setter).getMethod());
} else if (setter instanceof FieldSetter) {
return new ByteFieldSetter(((FieldSetter) setter).getField());
} else {
throw new IllegalArgumentException("Invalid type " + setter);
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static CharacterSetter toCharacterSetter(final Setter setter) {
if (isNullSetter(setter)) {
return null;
} else if (setter instanceof CharacterSetter) {
return (CharacterSetter) setter;
} else if (setter instanceof MethodSetter) {
return new CharacterMethodSetter(((MethodSetter) setter).getMethod());
} else if (setter instanceof FieldSetter) {
return new CharacterFieldSetter(((FieldSetter) setter).getField());
} else {
throw new IllegalArgumentException("Invalid type " + setter);
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static ShortSetter toShortSetter(final Setter setter) {
if (isNullSetter(setter)) {
return null;
} else if (setter instanceof ShortSetter) {
return (ShortSetter) setter;
} else if (setter instanceof MethodSetter) {
return new ShortMethodSetter(((MethodSetter) setter).getMethod());
} else if (setter instanceof FieldSetter) {
return new ShortFieldSetter(((FieldSetter) setter).getField());
} else {
throw new IllegalArgumentException("Invalid type " + setter);
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static IntSetter toIntSetter(final Setter setter) {
if (isNullSetter(setter)) {
return null;
} else if (setter instanceof IntSetter) {
return (IntSetter) setter;
} else if (setter instanceof MethodSetter) {
return new IntMethodSetter(((MethodSetter) setter).getMethod());
} else if (setter instanceof FieldSetter) {
return new IntFieldSetter(((FieldSetter) setter).getField());
} else {
throw new IllegalArgumentException("Invalid type " + setter);
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static LongSetter toLongSetter(final Setter setter) {
if (isNullSetter(setter)) {
return null;
} else if (setter instanceof LongSetter) {
return (LongSetter) setter;
} else if (setter instanceof MethodSetter) {
return new LongMethodSetter(((MethodSetter) setter).getMethod());
} else if (setter instanceof FieldSetter) {
return new LongFieldSetter(((FieldSetter) setter).getField());
} else {
throw new IllegalArgumentException("Invalid type " + setter);
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static FloatSetter toFloatSetter(final Setter setter) {
if (isNullSetter(setter)) {
return null;
} else if (setter instanceof FloatSetter) {
return (FloatSetter) setter;
} else if (setter instanceof MethodSetter) {
return new FloatMethodSetter(((MethodSetter) setter).getMethod());
} else if (setter instanceof FieldSetter) {
return new FloatFieldSetter(((FieldSetter) setter).getField());
} else {
throw new IllegalArgumentException("Invalid type " + setter);
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static DoubleSetter toDoubleSetter(final Setter setter) {
if (isNullSetter(setter)) {
return null;
} else if (setter instanceof DoubleSetter) {
return (DoubleSetter) setter;
} else if (setter instanceof MethodSetter) {
return new DoubleMethodSetter(((MethodSetter) setter).getMethod());
} else if (setter instanceof FieldSetter) {
return new DoubleFieldSetter(((FieldSetter) setter).getField());
} else {
throw new IllegalArgumentException("Invalid type " + setter);
}
}
}