org.jboss.modules
类ModuleClassLoader
java.lang.Objectjava.lang.ClassLoader
java.security.SecureClassLoader
org.jboss.modules.ConcurrentClassLoader
org.jboss.modules.ModuleClassLoader
公共类ModuleClassLoader 扩展 ConcurrentClassLoader
一个模块类加载器。该类的实例实现了模块中可用的类和资源的完整视图。与其对应Module
,具有访问类和资源的导出视图的API方法。
最开始进入执行类加载,如果在配置文件standalone.conf.bat(Windows)或standalone.conf(Unix / Linux)的-Djboss.modules.system.pkgs属性有值,则进行Classloader委托机制,否则进入自定义类加载器
private Class<?> performLoadClass(String className, boolean exportsOnly, final boolean resolve) throws ClassNotFoundException {
if (className == null) {
throw new IllegalArgumentException("name is null");
}
for (String s : Module.systemPackages) {
if (className.startsWith(s)) {
return definingLoader != null ? definingLoader.loadClass(className) : findSystemClass(className);
}
}
return performLoadClassChecked(className, exportsOnly, resolve);
}
performLoadClassChecked之后调用,findClass()
进如findclass
/** {@inheritDoc} */
@Override
protected final Class<?> findClass(String className, boolean exportsOnly, final boolean resolve) throws ClassNotFoundException {
// Check if we have already loaded it..
Class<?> loadedClass = findLoadedClass(className);//是否已加载
if (loadedClass != null) {
if (resolve) {
resolveClass(loadedClass);//连接
}
return loadedClass;
}
final ModuleLogger log = Module.log;
final Module module = this.module;
log.trace("Finding class %s from %s", className, module);
final Class<?> clazz = module.loadModuleClass(className, exportsOnly, resolve);//重要,进行加载类
if (clazz != null) {
return clazz;
}
log.trace("Class %s not found from %s", className, module);
throw new ClassNotFoundException(className + " from [" + module + "]");
}
不贴代码了,累死了,所以呢对于jboss7 的rasp的类加载问题,与tomcat rasp类加载问题同出一处,却又有点小差异,做一记录!