1 public void init() throws Exception { 2 3 initClassLoaders(); //加载一下jar包和类 4 5 Thread.currentThread().setContextClassLoader(catalinaLoader); //不知道有什么用 6 7 SecurityClassLoad.securityClassLoad(catalinaLoader); //加载一些类 8 9 // Load our startup class and call its process() method 10 if (log.isDebugEnabled()) 11 log.debug("Loading startup class"); 12 Class<?> startupClass = 13 catalinaLoader.loadClass 14 ("org.apache.catalina.startup.Catalina"); 15 Object startupInstance = startupClass.newInstance(); //反射生成catalina类实力 16 17 // Set the shared extensions class loader 18 if (log.isDebugEnabled()) 19 log.debug("Setting startup class properties"); 20 String methodName = "setParentClassLoader"; 21 Class<?> paramTypes[] = new Class[1]; 22 paramTypes[0] = Class.forName("java.lang.ClassLoader"); 23 Object paramValues[] = new Object[1]; 24 paramValues[0] = sharedLoader; 25 Method method = 26 startupInstance.getClass().getMethod(methodName, paramTypes); 27 method.invoke(startupInstance, paramValues); //反射调用setParentClassLoader 28 29 catalinaDaemon = startupInstance; 30
31 }
我对 tomcat中使用类加载而不用关键new 的见解
使用jar包中类的方法有两种:http://blog.csdn.net/wawmg/article/details/17961815
1.使用io流读取文件然后加载
2.读jar包,加载类,实例化
而tomcat的启动是通过bootstrap 加载一些公共类、配置环境、实例化Catalina类,具体的业务代码还是在catalina类里面的。这样反射的好处是解耦。 可以不依赖应用层的classpath独立加载,通过catalina.home指定相应的目录就可以了,对应用程序不可见