我观察了tomact目录结构发现只有jar文件,没有我们一般编写javase那样的编译后的class文件。
为何tomcat里面有些类会用发射,有些类直接使用new关键字。
1.反射
public void init() throwsException {
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");
Class> startupClass =
catalinaLoader.loadClass
("org.apache.catalina.startup.Catalina");
Object startupInstance = startupClass.newInstance();//Object startupInstance = new org.apache.catalina.startup.Catalina();//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);
catalinaDaemon=startupInstance;
}
2.Catalina类:
protectedDigester createStartDigester() {long t1=System.currentTimeMillis();//Initialize the digester
Digester digester = newDigester();
digester.setValidating(false);
digester.setRulesValidation(true);
HashMap, List> fakeAttributes = new HashMap<>();
ArrayList attrs = new ArrayList<>();
attrs.add("className");
fakeAttributes.put(Object.class, attrs);
digester.setFakeAttributes(fakeAttributes);
digester.setUseContextClassLoader(true);
.............
如上图所示,在1图中可以直接使用 Object startupInstance = new Catalina();吗?
因为tomcat目录中没有Catalina这个类,但是有.jar文件中含有这个类,我们可以这样使用吗?
为何tomcat源码中 部分使用反射生成实例,而部分则使用new关键字呢?而且tomcat启动有一个函数的代码是把bin目录下的jar包全部加载 (没有加载全部的类) 又是为何呢?