类加载器案例

1.Class文件以何种格式存储,类型何时加载、如何连接,以及虚拟机如何执行字节码指令等都是由虚拟机直接控制的行为,用户程序无法对其进行改变。能通过程序进行操作的,主要是字节码生成与类加载器这两个部分的功能。

2.一个功能健全的Web服务器,要解决如下问题:

3.由于上述问题,在部署Web应用的时候,Web服务器需要提供多个ClassPath路径供用户存放第三方类库,一般用“lib”或者“classes”命名。被放置到不同路径中的类库,具备不同的访问范围和服务对象,通常每一个目录都会有一个相应的自定义类加载器去加载放置在里面的java类库,如Tomcat目录结构中的四组目录含义分别是:

4.为了支持这套目录,并对目录里面的类库进行加载和隔离,Tomcat自定义了多个类加载器,这些类加载器按照经典的双亲委派模型来实现,如图

                  灰色背景的三个类加载器是JDK默认提供的类加载器,而CommonClassLoader、CatalinaClassLoader、SharedClassLoader和WebappClassLoader则是Tomcat自定义的类加载器,分别加载/common/*、/server/*、/shared/*和/WebaApp/WebApp/WEB_INF/*中的java类库逻辑。其中WebApp类加载器和Jsp类加载器通常会存在多个实例,每一个Web应用程序对应一个WebApp类加载器,每一个Jsp文件对应一个Jsp类加载器。

                  CommonClassLoader能加载的类都可以被CatalinaClassLoader和SharedClassLoader使用,而CatalinaClassLoader和SharedClassLoader自己能加载的类则与对方相互隔离。WebAppClassLoader可以使用SharedClassLoader加载到的类,但是各个WebAppClassLoader实例之间相互隔离。而JasperLoader的加载范围仅仅是这个JSP文件所编译出来的那一个Class,当服务器检测到JSP文件被修改的时候,会替换掉以前的JasperLoader的实例,并通过建立一个新的Jsp类加载器来实现JSP文件的HotSwap功能。

5.jdk1.6之后提供了Compiler API,可以动态地编译java程序,这样让服务器执行临时代码的需求是可以得到解决。

你可能感兴趣的:(java,jvm)