
org.sfm.reflect.ReflectionService Maven / Gradle / Ivy
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.Tuple2;
import org.sfm.tuples.Tuples;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import static org.sfm.utils.Asserts.requireNonNull;
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) {
requireNonNull("target", target);
ClassMeta meta = (ClassMeta) metaCache.get(target);
if (meta == null) {
meta = newClassMeta(target);
requireNonNull("meta", meta);
metaCache.putIfAbsent(target, meta);
}
return meta;
}
@SuppressWarnings("unchecked")
private ClassMeta newClassMeta(Type target) {
Class clazz = TypeHelper.toClass(target);
if (Map.class.isAssignableFrom(clazz)) {
return (ClassMeta) newMapMeta(target);
} else if (List.class.isAssignableFrom(clazz)) {
return newArrayListMeta(target);
} 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
© 2015 - 2025 Weber Informatics LLC | Privacy Policy