org.sfm.reflect.ReflectionService Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of simpleFlatMapper Show documentation
Show all versions of simpleFlatMapper 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.AsmInstantiatorDefinitionFactory;
import org.sfm.reflect.asm.AsmFactory;
import org.sfm.reflect.asm.AsmHelper;
import org.sfm.reflect.meta.*;
import org.sfm.tuples.Tuples;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public class ReflectionService {
private final ObjectSetterFactory objectSetterFactory;
private final ObjectGetterFactory objectGetterFactory;
private final InstantiatorFactory instantiatorFactory;
private final AsmFactory asmFactory;
private final AliasProvider aliasProvider;
private final boolean asmPresent;
private final boolean asmActivated;
private final ConcurrentMap> metaCache = new ConcurrentHashMap>();
public ReflectionService(final boolean asmPresent, final boolean asmActivated, final AsmFactory asmFactory) {
this.asmPresent = asmPresent;
this.asmActivated = asmActivated && asmPresent;
if (asmActivated) {
this.asmFactory = asmFactory;
} else {
this.asmFactory = null;
}
this.objectSetterFactory = new ObjectSetterFactory(asmFactory);
this.objectGetterFactory = new ObjectGetterFactory(asmFactory);
this.instantiatorFactory = new InstantiatorFactory(asmFactory);
this.aliasProvider = AliasProviderFactory.getAliasProvider();
}
public ObjectSetterFactory getObjectSetterFactory() {
return objectSetterFactory;
}
public InstantiatorFactory getInstantiatorFactory() {
return instantiatorFactory;
}
public boolean isAsmPresent() {
return asmPresent;
}
public boolean isAsmActivated() {
return asmActivated;
}
public AsmFactory getAsmFactory() {
return asmFactory;
}
@SuppressWarnings("unchecked")
public ClassMeta getClassMeta(Type target) {
ClassMeta meta = (ClassMeta) metaCache.get(target);
if (meta == null) {
meta = newClassMeta(target);
metaCache.putIfAbsent(target, meta);
}
return meta;
}
private ClassMeta newClassMeta(Type target) {
Class clazz = TypeHelper.toClass(target);
if (List.class.isAssignableFrom(clazz)) {
ParameterizedType pt = (ParameterizedType) target;
return newArrayListMeta(pt.getActualTypeArguments()[0]);
} else if (clazz.isArray()) {
return newArrayMeta(clazz);
//IFJAVA8_START
} else if (Optional.class.isAssignableFrom(clazz)) {
return new OptionalClassMeta(target, this);
//IFJAVA8_END
} else if (Tuples.isTuple(target)) {
return new TupleClassMeta(target, this);
} else if (isFastTuple(clazz)) {
return new FastTupleClassMeta(target, this);
}
if (isDirectType(target)) {
return new DirectClassMeta(target, this);
} else {
return new ObjectClassMeta(target, this);
}
}
private ClassMeta newArrayMeta(Class clazz) {
return new ArrayClassMeta(clazz, clazz.getComponentType(), this);
}
private ClassMeta newArrayListMeta(Type elementTarget) {
return new ArrayClassMeta(ArrayList.class, elementTarget, this);
}
private boolean isFastTuple(Class clazz) {
Class> superClass = clazz.getSuperclass();
return superClass != null && "com.boundary.tuple.FastTuple".equals(superClass.getName());
}
private boolean isDirectType(Type target) {
return TypeHelper.isJavaLang(target)|| TypeHelper.isEnum(target) || TypeHelper.areEquals(target, Date.class);
}
public String getColumnName(Method method) {
return aliasProvider.getAliasForMethod(method);
}
public String getColumnName(Field field) {
return aliasProvider.getAliasForField(field);
}
public List extractConstructors(Type target) throws IOException {
List list;
if (isAsmPresent()) {
try {
list = AsmInstantiatorDefinitionFactory.extractDefinitions(target);
} catch(IOException e) {
// no access to class file
list = ReflectionInstantiatorDefinitionFactory.extractDefinitions(target);
}
} else {
list = ReflectionInstantiatorDefinitionFactory.extractDefinitions(target);
}
Collections.sort(list);
return list;
}
public static ReflectionService newInstance() {
return newInstance(false, true);
}
private static final AsmFactory _asmFactory = new AsmFactory(Thread.currentThread().getContextClassLoader());
public static ReflectionService newInstance(boolean disableAsm, boolean useAsmGeneration) {
boolean asmPresent = AsmHelper.isAsmPresent() && !disableAsm;
boolean hasClassLoaderIncapacity = cannotSeeSetterFromContextClassLoader();
if (hasClassLoaderIncapacity) {
useAsmGeneration = false;
}
return new ReflectionService(asmPresent, useAsmGeneration, asmPresent && useAsmGeneration ? _asmFactory : null);
}
public static ReflectionService disableAsm() {
return newInstance(true, false);
}
private static boolean cannotSeeSetterFromContextClassLoader() {
try {
Class.forName(Setter.class.getName(), false, Thread.currentThread().getContextClassLoader());
} catch(Exception e) {
return true;
}
return false;
}
public ObjectGetterFactory getObjectGetterFactory() {
return objectGetterFactory;
}
}