`

Java中各类ClassLoader加载时资源搜索路径

    博客分类:
  • Java
阅读更多
关于Java如何加载类,可以参考下面这篇文章:
http://www.ibm.com/developerworks/cn/java/j-lo-classloader/

这里我们来了解下,各类ClassLoader是从哪些地方去寻找class类文件进行加载的?

JVM是通过一个称为ClassLoader东西来加载Class文件的,每当JVM启动,它就会生成三个ClassLoader,它们分别是Bootstrap Loader, ExtClassLoader 和AppClassLoader。

这三个ClassLoader作用是不同的,它们所加载的class文件也是不同的。
  • Bootstrap Loader是用C++语言实现的,它所加载的是JVM中最底层的类,它加载时的搜索路径是由sun.boot.class.path所指定的。
  • System.out.println(System.getProperty("sun.boot.class.path"));
    

    输出结果如下:
    E:\Program Files\Java\jdk1.6.0_31\jre\lib\resources.jar;
    E:\Program Files\Java\jdk1.6.0_31\jre\lib\rt.jar;
    E:\Program Files\Java\jdk1.6.0_31\jre\lib\sunrsasign.jar;
    E:\Program Files\Java\jdk1.6.0_31\jre\lib\jsse.jar;
    E:\Program Files\Java\jdk1.6.0_31\jre\lib\jce.jar;
    E:\Program Files\Java\jdk1.6.0_31\jre\lib\charsets.jar;
    E:\Program Files\Java\jdk1.6.0_31\jre\lib\modules\jdk.boot.jar;
    E:\Program Files\Java\jdk1.6.0_31\jre\classes

  • ExtClassLoader是用来加载java的一些库的,它加载时的搜索路径是由java.ext.dirs来决定的,该加载器在加载时不同于其他加载器,它加载时会搜索指定路径下的所有子目录,也就是说它会搜索java.ext.dirs所指定下的所有子目录下的class文件或jar文件。同时也可以用参数-Djava.ext.dirs来改变它的搜索路径。
  • System.out.println(System.getProperty("java.ext.dirs"));
    

    输出结果如下:
    E:\Program Files\Java\jdk1.6.0_31\jre\lib\ext;
    C:\Windows\Sun\Java\lib\ext

  • AppClassLoader也称System ClassLoader, 它的搜索路径是由java.class.path来指定的,而且要注意AppClassLoader不会搜索java.class.path下的子目录的。
  • System.out.println(System.getProperty("java.class.path"));
    

    输出结果如下:
    D:\workspace_dbm\study\bin;
    D:\workspace_dbm\study\lib\common-sdl-1.1.1-TAG20120213-SNAPSHOT.jar;
    D:\workspace_dbm\study\lib\commons-logging-1.1.1.jar;
    D:\workspace_dbm\study\lib\commons-lang-2.6.jar;
    D:\workspace_dbm\study\lib\tools.jar


    ExtClassLoader 和AppClassLoader在JVM中只会存在一个实例,一旦运行了是无法改变它们的搜索路径的,也就是无法在程序中通过调用System.setProperty()来改变java.class.path或java.ext.dirs来改变它们的搜索路径的。
    分享到:
    评论

    相关推荐

      JAVA类加载

      Java 语言是一种具有动态... class 文件放到 Java 的路径当中, 等到下次该 Java 虚拟机器重新激活时,这个逻辑上的 Java 应用程序就会因为加载了新修改的 .class 文件,自己的功能也做了更新,这就是 Java 的动态性。

      java class加密保护工具

      执行java时带上参数-agentlib:<动态文件所在路径>\classloader 注意此处不要后缀名.dll(或者.so)。 如: windows下执行java: java -agentlib:C:\classloader HelloWorld Linux、Unix等系列操作系统下执行java: ...

      indexed-classloader:一个自定义的 JVM 类加载器,它索引类路径元素以获得更快的类资源位置

      构建: ./make-jar.sh 要使用,将indexed-classpath.jar添加到类路径并设置-Djava.system.class.loader=org.pantsbuild.classloader.IndexedURLClassLoader 。 添加-verbose:class以查看来自类加载器的调试信息。

      在可执行jar中载入第三方jar的几个解决方法

      以下情景是很多Java开发人员经常碰到的:在开发,调试阶段,通过在CLASSPATH中设置第三方的jar包路径,自己编写的class工作正常.开发完毕,部署的时候,将开发的class打成一个可执行jar包,会发现通过Class.forName...

      java深度历险——王森

      关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加载Class的;另一个问题是package和import问题,如何来寻找类的路径问题。把这两...

      java类加密工具v2.1

      执行java时带上参数-agentlib:<动态文件所在路径>\classloader 注意此处不要后缀名.dll(或者.so)。 如: 我把classloader.dll放在C:\目录下; 运行加密后的class文件命令如下: windows下执行java: java -agentlib:...

      Java类加密程序

      执行java时带上参数 -agentlib:<动态库文件所在路径>\hidea 注意:不要加文件后缀.dll,直接使用文件的名字部分(classloader)! <br>举例说明:例如,本加密工具安装在c:\hideasoft\java_protect,执行...

      Java类加密2.0版本,无限制

      独立的应用程序(Application,自定义main方法),运行java时,带上参数-agentlib:<所在路径>\lanswon Tomcat等JAVA Web Server,修改启动脚本,把执行java的命令行加上参数-agentlib:<所在路径>\lanswon JBOSS等...

      jre-8u202-windows-i586.exe

      JRE中由ClassLoader负责查找和加载程序引用到的类库,基础类库ClassLoader会到rt.jar中自动加载,其它的类库,ClassLoader在环境变量CLASSPATH指定的路径中搜索,按照先来先到的原则,放在CLASSPATH前面的类库先被...

      jre8u202i586.zip

      JRE中由ClassLoader负责查找和加载程序引用到的类库,基础类库ClassLoader会到rt.jar中自动加载,其它的类库,ClassLoader在环境变量CLASSPATH指定的路径中搜索,按照先来先到的原则,放在CLASSPATH前面的类库先被...

      classloader-servlet:Servlet 在 JEE 环境中查找类加载器路径并调试类加载问题

      Project 提供了两个 servlet ,它们有助于调试 Java Web 应用程序中的类加载问题。 这是一个项目。 JavaEE 兼容版本 servlet 与 Servlet 3.0 规范兼容,只能在 JavaEE 6.0+ 应用程序中使用。 安装 将 Jar 文件放在 ...

      java class加密保护(完全免费) v2.1

      执行java时带上参数-agentlib:<动态文件所在路径>\classloader 注意此处不要后缀名.dll(或者.so)。 如: 我把classloader.dll放在C:\目录下; 运行加密后的class文件命令如下: windows下执行java: java -agentlib:...

      Java类加密工具v2.2(免注册)

      执行java时带上参数-agentlib:<动态文件所在路径>\classloader 注意此处不要后缀名.dll(或者.so)。 如: 我把classloader.dll放在C:\目录下; 运行加密后的class文件命令如下: windows下执行java: java -...

      我心飞扬java类加密工具2.1(亲测可用)

      执行java时带上参数-agentlib:<动态文件所在路径>\classloader 注意此处不要后缀名.dll(或者.so)。 如: windows下执行java: java -agentlib:C:\classloader HelloWorld Linux、Unix等系列操作系统下执行java: ...

      JAVA面试题最全集

      37.classloader中,JDK的API、Classpath中的同web-inf中的class加载方式有什么区别? 38.列举三种以上垃圾回收算法,并比较其优缺点? 39.编写代码实现一个线程池 40.描述一下JVM加载class文件的原理机制? 41....

      Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

      必须要时从Java SE API的源代码分析,了解各种语法在Java SE API中如何应用。  《Java JDK 7学习笔记》将IDE操作纳为教学内容之一,使读者能与实践结合,提供的视频教学能更清楚地帮助读者掌握操作步骤。 内容简介 ...

      Java 2平台安全技术-结构,API设计和实现

      3.9.2 java.lang.ClassLoader和授权 46 3.9.3 java.security.SecureClassLoader 49 3.9.4 java.net.URLClassLoader 49 3.9.5 类的路径 50 3.10 java.lang.SecurityManager 51 3.10.1 使用安全管理器的实例 51 3.10.2...

      实用java学习过程

      其实JDK的学习没有那么简单,关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加载Class的;另一个问题是package和import问题,...

      JAVA 2平台安全技术-结构,API设计和实现

      3.9.2 java.lang.ClassLoader和授权 46 3.9.3 java.security.SecureClassLoader 49 3.9.4 java.net.URLClassLoader 49 3.9.5 类的路径 50 3.10 java.lang.SecurityManager 51 3.10.1 使用安全管理器的实例 51 3.10.2...

      Java编程经验

      不过至少笔者今日才弄懂JVM去查询类的原理,编译器加载类要依靠classloader, 而classloader有3个级别,从高到低分别是BootClassLoader(名字可能不准确) , ExtClassLoader, AppClassLoader. 这3个加载器分别对应着...

    Global site tag (gtag.js) - Google Analytics