1、StandardClassLoader 继承自URLClassLoader,和URLClassLoader相比没有添加任务新的功能。这个类已经被tomcat7.x废弃掉了,官方准备在tomcat8.x版本中去掉这个类。
2、BootStrapClassLoader是用本地代码实现的,它负责加载核心的java class(即所有java.*开头的类)。另外JVM还提供了两个类加载器,ExtensionClassLoader和SystemClassLoader。都是用java编写的,都是java.lang.ClassLoader的子类,由Bootstrap ClassLoader加载后才能使用。其中Extension ClassLoader负责加载扩展的java class(例如所有的javax.*开头的类和存放在JRE的ext目录下的类),System ClassLoader负责加载应用程序自身的类。
3、URLClassLoader是SecureClassLoader的子类
4、URLClassLoader通过findClass方法来加载一个类。
5、Package的创建中会搜集jar包中manifest中的一些描述信息。
6、要自定义类加载器,需要继承 java.lang.ClassLoader 并要重写其中的findClass方法,因为如果不重写这个方法的话,默认是抛出ClassNotFoundException的。
7、Protected final Class<?>defineClass(String name,byte[] b,int off,int len);这个方法将一个字节数组转换成一个Class并初始化。如果不能转换的话,就会抛一个异常ClassFormatError。
8、New 是在编译的时候检查.class类型和路径,class.forName(“xxx”).newInstance()是在运行时找到给路径的类进行实例化,相当于先检查路径然后再进行实例化。
9、Class下的newInstance()的使用有局限,因为它生成的对象只能调用无参的构造函数,而使用new关键字生成的对象没有这个限制。
10、Q:为什么说servlet 只能访问WEB-INF/classes下面的类?
A:其实这句话我理解错了,这句话的意思不是说servlet去载入某些类,而是当载入servlet的时候,只能把servlet放到WEB-INF/classes或者WEB-INF/lib中。
11、当准备运行servlet的时候,必须把它存放到其中一个web应用程序的/WEB-INF/classes目录中,这样就可以通过web程序的上下文路径和该servlet名来调用该servlet了。
12、WebappLoader的866行和918行指定了要加载的servlet类的范围,是写死的/WEB-INF/classes /WEB-INF/lib
13、WEB-INF\web.xml :<load-on-startup>1<load-on-startup> 表明在应用程序启动的时候执行指定的servlet,这里的1代表被加载的优先级,数值越小,代表被加载的优先级越高。
14、$CATALINA_HOME/conf/ 下的web.xml 还是需要好好研究一下的。
15、$CATALINA_HOME/conf/web.xml 当中配置了一个默认的Servlet,叫作:org.apache.catalina.servlets.DefaultServlet,这个Servlet主要负责服务 图片资源以及静态资源,像jsp这种资源则不提供服务。
16、Web.xml 的解析在ContextConfig这个类中完成。
17、WebRuleSet 这个类负责定义了解析部署描述符web.xml涉及到的规则以及规则路径的定义。
18、JSP的编译器是org.apache.jasper.compiler.Compiler,负责将jsp文件编译成servlet。
19、$WEB-INF_HOME/conf/web.xml 这个目录下配置了两个Servlet的,这两个servlet都在启动的时候去加载,一个是org.apache.catalina.servlets.DefaultServlet,另一个是org.apache.jasper.servlet.JspServlet前一个servlet主要负责静态资源的访问加载,第二个Servlet主要负责JspServlet的编译解析。
20、Tomcat的容器实现热部署使用了两种机制:
ClassLoader重写,通过自定义classloader加载相应的jsp编译后的class到JVM中。
通过动态的修改内存中的自己码,将修改过的class再次装在到JVM中。
21、Tomcat中为了加载jsp编译好的类,实现了一个Jsp的一个类加载器,类的权限定名是:
org.apache.jasper.servlet.JasperLoader.
22、对于jsp页面tomcat都用了一个独立的classloader来装载,每次修改完jsp后,tomcat都将使用一个新的classloader来装载它。(有疑问??)
23、ContainerBase 当中有个backgroundProcess()方法,貌似是用来定时检查文件的修改,实现热部署的。
24、在Container接口中,定义了backgroundProcess()方法,这个方法的目的是为容器起一条后台线程,在后台定时的去做一些事情,比如说类的热部署。
来源:oschina
链接:https://my.oschina.net/u/1417419/blog/198470