介绍
该笔记是在学习拉勾教育 Java 高薪训练营后,结合课程和老师的视频,自己跟踪源码后做的笔记。
Bootstrap#init
主要是通过反射创建实例 Catalina,用于调用 Catalina.load() 方法。
- initClassLoaders(),初始化、创建类加载器,比如 catalinaLoader;
- 使用类加载器 catalinaLoader,加载并实例化 Catalina,使用变量保存 Catalina 实例。
public void init() throws Exception {
// 初始化、创建类加载器
initClassLoaders();
// catalinaLoader 在 initClassLoaders() 中已创建,设置当前线程的类加载器
Thread.currentThread().setContextClassLoader(catalinaLoader);
// 载入一些包
SecurityClassLoad.securityClassLoad(catalinaLoader);
// Load our startup class and call its process() method
if (log.isDebugEnabled())
log.debug("Loading startup class");
// 使用类加载器加载 Catalina
Class<?> startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");
// 实例化 Catalina
Object startupInstance = startupClass.getConstructor().newInstance();
// Set the shared extensions class loader
if (log.isDebugEnabled())
log.debug("Setting startup class properties");
String methodName = "setParentClassLoader";
Class<?> paramTypes[] = new Class[1];
paramTypes[0] = Class.forName("java.lang.ClassLoader");
Object paramValues[] = new Object[1];
paramValues[0] = sharedLoader;
Method method =
startupInstance.getClass().getMethod(methodName, paramTypes);
method.invoke(startupInstance, paramValues);
// 使用变量保存 Catalina 实例
catalinaDaemon = startupInstance;
}