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

com.moon.runner.core.IGetLoad Maven / Gradle / Ivy

package com.moon.runner.core;

import com.moon.core.lang.PackageScanner;
import com.moon.core.lang.PackageUtil;
import com.moon.core.lang.ref.ReferenceUtil;
import com.moon.core.lang.reflect.ModifierUtil;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

import static com.moon.core.lang.ThrowUtil.noInstanceError;

/**
 * @author moonsky
 */
class IGetLoad {

    private IGetLoad() { noInstanceError(); }

    private final static String[] packages;
    private final static Map NAMED_CACHE = new HashMap<>();

    static {
        Map packagesName = new LinkedHashMap<>();
        PackageScanner scanner = PackageUtil.scanner();
        scanner.scan("com.moon.core");
        packagesName.putIfAbsent("java.util.", null);
        packagesName.putIfAbsent("java.lang.", null);
        for (String className : scanner) {
            Class loaded = loadClass(className);
            if (loaded != null) {
                packagesName.putIfAbsent(loaded.getPackage().getName() + '.', null);
                NAMED_CACHE.putIfAbsent(loaded.getCanonicalName(), loaded);
            }
        }
        Set names = packagesName.keySet();
        packages = names.toArray(new String[names.size()]);
    }

    private final static Class loadClass(String className) {
        try {
            return Class.forName(className);
        } catch (Throwable e) {
            return null;
        }
    }

    private final static Map CACHE = ReferenceUtil.weakMap();

    public final static Class tryLoad(String name) {
        Map cache = NAMED_CACHE;
        Class type = cache.get(name);
        if (type == null && (type = (cache = CACHE).get(name)) == null) {
            for (String packageName : packages) {
                if (ModifierUtil.isPublic(type = loadClass(packageName + name))) {
                    if (cache.get(name) == null) {
                        synchronized (cache) {
                            cache.put(name, type);
                        }
                    }
                    return type;
                }
            }
        }
        return type;
    }

    public final static Class of(String name) {
        Class type = tryLoad(name);
        if (type == null) {
            throw new IllegalArgumentException("can not find class of key: " + name);
        }
        return type;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy