tomcat类加载器测试

tomcat的类加载器
WebappClassLoader context: /oalocal delegate: false
repositories: /WEB-INF/classes/ ----------> Parent Classloader: org.apache.catalina.loader.StandardClassLoader@c44b88

Thread.currentThread().getContextClassLoader():输出  WebappClassLoader
Thread.currentThread().getContextClassLoader().getSystemClassLoader(): 输出 sun.misc.Launcher$AppClassLoader@1cde100

AppClassLoader
        | StandardClassLoader
                  |  WebappClassLoader

System.getProperty("java.class.path")

打印出某个类加载器的所有JAR包,以下是打印出WEB-INF/lib下的所有包  

线程上下文加载器,举了JNDI的例子。逆着正常的加载来做。上下文类加载器要比当前类加载器更适合于框架编程,而当前类加载器则更适合于业务逻辑编程。


    out.println(Thread.currentThread().getContextClassLoader());//打印出WEB-INF/lib下的所有包
    try {
            java.net.URL[] extURLs = ((java.net.URLClassLoader)Thread.currentThread().getContextClassLoader()).getURLs();
            for (int i = 0; i < extURLs.length; i++) {
                     out.println(extURLs[i]);
              }
       } catch (Exception e) {
     }
     out.println("--------------------------<br><br>");
     //org.apache.catalina.loader.StandardClassLoader  打印出tomcat/lib下的所有包
     out.println(Thread.currentThread().getContextClassLoader().getParent());
         try {
            java.net.URL[] extURLs = ((java.net.URLClassLoader)Thread.currentThread().getContextClassLoader().getParent()).getURLs();
            for (int i = 0; i < extURLs.length; i++) {
                     out.println(extURLs[i]);
              }
       } catch (Exception e) {
     }
     out.println("--------------------------<br><br>");
     //sun.misc.Launcher$AppClassLoader 打印出jdk下的所有包/D:/apache-tomcat-6.0.30/bin/bootstrap.jar file:/D:/jdk1.6.0_21/lib/tools.jar
     out.println(Thread.currentThread().getContextClassLoader().getParent().getParent());
         try {
            java.net.URL[] extURLs = ((java.net.URLClassLoader)Thread.currentThread().getContextClassLoader().getParent().getParent()).getURLs();
            for (int i = 0; i < extURLs.length; i++) {
                     out.println(extURLs[i]);
              }
       } catch (Exception e) {
     }
     

2.1    JVM三种预定义类型类加载器

我们首先看一下JVM预定义的三种类型类加载器,当一个 JVM 启动的时候,Java 缺省开始使用如下三种类型类装入器:

启动(Bootstrap)类加载器:引导类装入器是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib 下面的类库加载到内存中。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。

标准扩展(Extension)类加载器:扩展类加载器是由 Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader) 实现的。它负责将 < Java_Runtime_Home >/lib/ext 或者由系统变量 java.ext.dir 指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。

系统(System)类加载器:系统类加载器是由 Sun 的 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。它负责将系统类路径(CLASSPATH)中指定的类库加载到内存中。开发者可以直接使用系统类加载器。

除了以上列举的三种类加载器,还有一种比较特殊的类型就是线程上下文类加载器,这个将在后面单独介绍。

 Thread.currentThread().getContextClassLoader()
 
 参数构建完毕之后,开始设置类加载器
 Thread.currentThread().setContextClassLoader(apiObjectFactory.getClassLoaderInstance(FileHelper.getFolder(method)));
 
 也就是说,如果不设置ContextClassLoader的话,用的就是系统的类加载器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值