package com.firefly.utils.classproxy; import com.firefly.utils.ReflectUtils; import com.firefly.utils.ReflectUtils.ProxyFactory; import com.firefly.utils.collection.ConcurrentReferenceHashMap; import com.firefly.utils.collection.IdentityHashMap; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public abstract class AbstractProxyFactory implements ProxyFactory { protected final ConcurrentHashMap<Method, ReflectUtils.MethodProxy> methodCache = new ConcurrentHashMap<>(); protected final ConcurrentHashMap<Field, ReflectUtils.FieldProxy> fieldCache = new ConcurrentHashMap<>(); protected final ConcurrentHashMap<Class<?>, ReflectUtils.ArrayProxy> arrayCache = new ConcurrentHashMap<>(); static final IdentityHashMap<Class<?>, String> primitiveWrapMap = new IdentityHashMap<>(); public static ClassLoader classLoader; static { primitiveWrapMap.put(short.class, Short.class.getCanonicalName()); primitiveWrapMap.put(byte.class, Byte.class.getCanonicalName()); primitiveWrapMap.put(int.class, Integer.class.getCanonicalName()); primitiveWrapMap.put(char.class, Character.class.getCanonicalName()); primitiveWrapMap.put(float.class, Float.class.getCanonicalName()); primitiveWrapMap.put(double.class, Double.class.getCanonicalName()); primitiveWrapMap.put(long.class, Long.class.getCanonicalName()); primitiveWrapMap.put(boolean.class, Boolean.class.getCanonicalName()); classLoader = Thread.currentThread().getContextClassLoader(); } @Override public ReflectUtils.MethodProxy getMethodProxy(Method method) { return methodCache.computeIfAbsent(method, this::_getMethodProxy); } abstract protected ReflectUtils.MethodProxy _getMethodProxy(Method method); @Override public ReflectUtils.ArrayProxy getArrayProxy(Class<?> clazz) { return arrayCache.computeIfAbsent(clazz, this::_getArrayProxy); } abstract protected ReflectUtils.ArrayProxy _getArrayProxy(Class<?> clazz); @Override public ReflectUtils.FieldProxy getFieldProxy(Field field) { return fieldCache.computeIfAbsent(field, this::_getFieldProxy); } abstract protected ReflectUtils.FieldProxy _getFieldProxy(Field field); }