tomcat类加载器深入研究笔记

来源:互联网 发布:网络数据分析邱均平 编辑:程序博客网 时间:2024/06/17 00:56

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.  为什么说servlet 只能访问WEB-INF/classes下面的类?

Answer:其实这句话我理解错了,这句话的意思不是说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的容器实现热部署使用了两种机制:

1)  ClassLoader重写,通过自定义classloader加载相应的jsp编译后的class到JVM中。

2)  通过动态的修改内存中的自己码,将修改过的class再次装在到JVM中。

21.  Tomcat中为了加载jsp编译好的类,实现了一个Jsp的一个类加载器,类的权限定名是:

org.apache.jasper.servlet.JasperLoader.

22.  对于jsp页面tomcat都用了一个独立的classloader来装载,每次修改完jsp后,tomcat都将使用一个新的classloader来装载它。

23.  ContainerBase 当中有个backgroundProcess()方法,貌似是用来定时检查文件的修改,实现热部署的。

24.  在Container接口中,定义了backgroundProcess()方法,这个方法的目的是为容器起一条后台线程,在后台定时的去做一些事情,比如说类的热部署。

 

原创粉丝点击