package com.github.ltsopensource.core.support; import com.github.ltsopensource.core.logger.Logger; import com.github.ltsopensource.core.logger.LoggerFactory; import java.lang.reflect.Field; import java.util.Vector; /** * 用来处理跨classLoader 共享class * @author Robert HG (254963746@qq.com) on 6/25/16. */ public class CrossClassLoader { private static final Logger LOGGER = LoggerFactory.getLogger(CrossClassLoader.class); private static Field classes; private static final Object LOCK = new Object(); static { try { classes = ClassLoader.class.getDeclaredField("classes"); classes.setAccessible(true); } catch (Throwable e) { LOGGER.error("get ClassLoader 'classes' Field Error", e); } } @SuppressWarnings("unchecked") public static Class loadClass(String classname) throws ClassNotFoundException { if (classes == null) { return Thread.currentThread().getContextClassLoader().loadClass(classname); } try { synchronized (LOCK) { Vector v = (Vector) classes.get(CrossClassLoader.class.getClassLoader().getParent()); for (int i = 0; i < v.size(); i++) { Class o = (Class) v.get(i); if (classname.equals(o.getName())) { return o; } } Class clazz = CrossClassLoader.class.getClassLoader().loadClass(classname); v.add(clazz); return clazz; } } catch (Exception e) { throw new ClassNotFoundException("load " + classname + " Error ", e); } } }