private void load(String[] arguments) throws Exception { // Call the load() method String methodName = "load"; Object param[]; Class<?> paramTypes[]; if (arguments==null || arguments.length==0) { paramTypes = null; param = null; } else { paramTypes = new Class[1]; paramTypes[0] = arguments.getClass(); param = new Object[1]; param[0] = arguments; } Method method = catalinaDaemon.getClass().getMethod(methodName, paramTypes); if (log.isDebugEnabled()) log.debug("Calling startup class " + method); method.invoke(catalinaDaemon, param); }
tomcat启动的时候,
Bootstrap init的时候,就已经把Catalina实例化出来了,接下来load的时候为什么还用反射啊?
Class<?> startupClass = catalinaLoader.loadClass ("org.apache.catalina.startup.Catalina"); Object startupInstance = startupClass.newInstance(); catalinaDaemon = startupInstance;
使用反射,可确保其正确访问加载了Catalina.class类文件的类加载器的对应的Cataline实例对象吧。
Catalina.getClass()-->CatalinaClassLoader-->catalina对象。
因为Tomcat包含三个类加载器,使用双亲委派模式。