All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.org.atool.fluent.mybatis.mapper.EntityHelperFactory Maven / Gradle / Ivy

package cn.org.atool.fluent.mybatis.mapper;

import cn.org.atool.fluent.mybatis.base.IEntity;
import cn.org.atool.fluent.mybatis.base.entity.IEntityHelper;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import static cn.org.atool.fluent.mybatis.mapper.FluentConst.Suffix_EntityHelper;

/**
 * 获取和构建Entity对应的帮助类实例
 *
 * @author wudarui
 */
public class EntityHelperFactory {
    private final static Map, IEntityHelper> INSTANCES = new HashMap<>();

    private final static Lock lock = new ReentrantLock(true);

    /**
     * 采用反射构造方式
     *
     * @param clazz 实例类型
     * @return IEntityHelper
     */
    public static IEntityHelper getInstance(Class clazz) {
        if (INSTANCES.containsKey(clazz)) {
            return INSTANCES.get(clazz);
        }
        try {
            lock.lock();
            if (INSTANCES.containsKey(clazz)) {
                return INSTANCES.get(clazz);
            }
            Set classLoaders = getClassLoaders(clazz);
            IEntityHelper helper = loadEntityHelper(clazz, classLoaders);
            INSTANCES.put(clazz, helper);
            return helper;
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } finally {
            lock.unlock();
        }
    }

    protected static Set getClassLoaders(Class clazz) {
        Set classLoaders = new HashSet<>(3);
        classLoaders.add(clazz.getClassLoader());

        if (Thread.currentThread().getContextClassLoader() != null) {
            classLoaders.add(Thread.currentThread().getContextClassLoader());
        }
        classLoaders.add(IEntityHelper.class.getClassLoader());
        return classLoaders;
    }

    /**
     * 加载entityClass对应的Helper类
     *
     * @param entityClass  实例类型
     * @param classLoaders ClassLoader列表
     * @return IEntityHelper
     */
    private static IEntityHelper loadEntityHelper(Class entityClass, Set classLoaders) throws ClassNotFoundException {
        String helperName = entityClass.getName() + Suffix_EntityHelper;
        for (ClassLoader classLoader : classLoaders) {
            IEntityHelper helper;
            try {
                helper = (IEntityHelper) classLoader.loadClass(helperName).getConstructor().newInstance();
            } catch (Exception e) {
                helper = null;
            }
            if (helper != null) {
                return helper;
            }
        }
        throw new ClassNotFoundException("Cannot find entity helper class: " + helperName);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy