`

java 类库 类加载器 jdk jre 总结。

阅读更多
1.类加载器

    详细资料看:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/
    节选:
       Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:
         引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。
         扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
         系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。
         除了系统提供的类加载器以外,开发人员可以通过继承 java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。

     虚拟机在运行一个类时,需要将其装入内存,虚拟机搜索类的方式和顺序如下:  Bootstrap classes,Extension classes,User classes。
  那么到底三个加载器加载的class具体在什么位置?看下节。
     
2.类库

     Bootstrap 中的路径是虚拟机自带的 jar 或 zip 文件,虚拟机首先搜索这些包文件,用System.getProperty("sun.boot.class.path")可得到虚拟机搜索的包名。  
     Extension 是位于 jre\lib\ext 目录下的 jar 文件,虚拟机在搜索完 Bootstrap 后就搜索该目录下的 jar 文件。用 System. getProperty("java.ext.dirs”)可得到虚拟机使用Extension 搜索路径。
     User classes 搜索顺序为当前目录、环境变量 CLASSPATH、-classpath。在运行时可用 System.getProperty(“java.class.path”)得到虚拟机查找类的路径。
  
用下面程序获得系统信息:
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;

import sun.net.spi.nameservice.dns.DNSNameService;
public class test {
    public static void main(String[] args) throws Exception{
		Properties p=System.getProperties();
		Set<Object> s=p.keySet();
		Iterator<Object> i=s.iterator();
		while((i).hasNext()){
			String key=(String)i.next();
			if(key.contains("java.class.path")||key.contains("java.ext.dirs")||key.contains("sun.boot.class.path"))
			System.out.println(key+":"+p.get(key));
		}
		System.out.println(new DNSNameService().getClass().getClassLoader());
	}
}



输出如下:

    
      java.class.path:D:\dhw\workspace\test\WebRoot\WEB-INF\classes;
D:\dhw\workspace\framework\WebRoot\WEB-INF\lib\classes12.jar
      java.ext.dirs:D:\ProgramFiles\Java\jdk1.6.0_29\jre\lib\ext;
C:\WINDOWS\Sun\Java\lib\ext
      sun.boot.class.path:
D:\ProgramFiles\MyEclipse10\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.0.0.me201110301321\data\libraryset\1.4\activation.jar;
D:\ProgramFiles\MyEclipse10\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.0.0.me201110301321\data\libraryset\1.4\javax.servlet.jar;
D:\ProgramFiles\MyEclipse10\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.0.0.me201110301321\data\libraryset\1.4\javax.servlet.jsp.jar;
D:\ProgramFiles\MyEclipse10\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.0.0.me201110301321\data\libraryset\1.4\jboss-j2ee.jar;
D:\ProgramFiles\MyEclipse10\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.0.0.me201110301321\data\libraryset\1.4\jboss-jaxrpc.jar;
D:\ProgramFiles\MyEclipse10\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.0.0.me201110301321\data\libraryset\1.4\jboss-jsr77.jar;
D:\ProgramFiles\MyEclipse10\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.0.0.me201110301321\data\libraryset\1.4\jboss-saaj.jar;
D:\ProgramFiles\MyEclipse10\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.0.0.me201110301321\data\libraryset\1.4\mail.jar;
D:\ProgramFiles\MyEclipse10\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.0.0.me201110301321\data\libraryset\1.4\namespace.jar;
D:\ProgramFiles\MyEclipse10\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.0.0.me201110301321\data\libraryset\1.4\xml-apis.jar;
D:\Program Files\Java\jdk1.6.0_29\jre\lib\resources.jar;
D:\Program Files\Java\jdk1.6.0_29\jre\lib\rt.jar;
D:\Program Files\Java\jdk1.6.0_29\jre\lib\sunrsasign.jar;
D:\Program Files\Java\jdk1.6.0_29\jre\lib\jsse.jar;
D:\Program Files\Java\jdk1.6.0_29\jre\lib\jce.jar;
D:\Program Files\Java\jdk1.6.0_29\jre\lib\charsets.jar;
D:\Program Files\Java\jdk1.6.0_29\jre\lib\modules\jdk.boot.jar;
D:\Program Files\Java\jdk1.6.0_29\jre\classes
sun.misc.Launcher$ExtClassLoader@6b97fd
     

在结合库目录截图来说明:

   java.class.path:指定的是项目本身和引用的其他第三方外部包的所有类文件目录,由系统类加载器加载。
   java.ext.dirs:指定虚拟机的实现所提供一个扩展库目录,由扩展类加载器加载。截图中红圈所示目录(\ext)
   sun.boot.class.path:指定Java的核心库,javaee库和javase库(jre\lib\下,注意没有jre\lib\ext下)的类文件,由引导类加载器加载。

   最后输出DNSNameService的类加载器,可以看到是有扩展类加载器加载的,因为它在ext目录下。一般而言扩展类是跟我们开发者无关的,虚拟机提供的,所以不是什么javax开头的包就属于扩展类库。

    可以在运行上面这个test类的时候给虚拟机加上-verbose参数,即java -verbose className,这样控制台能显示出详细的类加载过程。

3.dk和jre

回家再写。

0
1
分享到:
评论

相关推荐

    JDK6.0+JRE.zip

    JDK Java SE Development kit(JDK) java开发工具包 ...JVM是运行java程序的核心虚拟机,还需要其他的类加载器,字节码校验器,以及大量的基础类库。JRM除了包含JVM之外,还包含运行java程序的其它环境支持。

    jdk1.8.0_131.tar.gz

    JDK全称Java SE Development kit(JDK),即java标准版开发包,是Oracle提供的一套用于开发java应用程序的开发包,它提供编译,运行java程序所需要的各种工具和资源,包括java编译器,java运行时环境,以及常用的java...

    JAVA 开发环境 Java SE Development Kit (JDK) 16.0.1 x64 免费下载.zip

    作为最常用的 Java 软件开发套件(SDK),JDK 的第一手组件包括 Java 应用程序的加载器(简称为 Java),即由编译器(javac)创建的类文件的解释器,该编译器本身就是源代码。从原始格式到 Java 字节码的代码,以及...

    JAVA 开发环境 Java SE Development Kit (JDK) 16.0.1 x64.zip

    作为最常用的 Java 软件开发套件(SDK),JDK 的第一手组件包括 Java 应用程序的加载器(简称为 Java),即由编译器(javac)创建的类文件的解释器,该编译器本身就是源代码。从原始格式到 Java 字节码的代码,以及...

    corejava基础重要知识点总结

    CLASSPATH:类加载器使用 让类加载器明确去哪里加载.class文件 通常不需要设置 默认值:. .:当前目录(.java) CLASSPATH相当于中国的低保制度 JAVA_HOME:其他的程序使用 WEB 设置方式: 1:一次性的设置 ...

    Java编程经验

    这3个加载器分别对应着编译器去寻找类文件的优先级别和不同的路径:BootClassLoader对应jre/classes路径,是编译器最优先寻找class的地方 ExtClassLoader对应jre/lib/ext路径,是编译器次优先寻找class的地方 ...

    Java常见面试问题整理.docx

    面试问题整理:JVMJRE、JDK、JVM,JVM :英文名称(Java Virtual Machine),就是我们耳熟能详的 Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的...

    疯狂的java讲义源码-Java_study:ideagithub测试

    疯狂的java讲义 源码 这是Java学习中的一些代码以及...JRE:Java运行时环境,它包含了JVM(Java虚拟机)还有类加载器、字节码校验器以及大量的基础类库。 6 2018-10-30 Java集合,HashSet和TreeSet(无序和有序) 7 2

    毕业设计订餐系统源码-JavaLearn:javaSE演示

    3、JVM中的类加载器加载字节码文件 4、JVM中的执行引擎找到入口方法main(),执行其中的方法 一、JDK、JRE、JVM区别与联系 JDK是 Java 语言的软件开发工具包(SDK)。在JDK的安装目录下有一个jre目录,里面有两个文件夹...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

     《Java开发实战1200例》分为I、II两卷共计1200个例子,包括了开发中各个方面最常用的实例,是目前市场上实例最全面的开发类图书;书中实例来源于多位工程师的多年积累,具有很强的实用性。 本书是第II卷,以开发...

    Java 虚拟机面试题全面解析(干货)

    Java 虚拟机面试题全面解析,《深入理解Java虚拟机》干货版,自己总结,希望能够帮助大家,免费下载~什么是类加载机制? 虚拟机和物理机的区别是什么? 运行时栈帧结构 Java方法调用 什么是方法调用? Java的方法调用,...

    新版Android开发教程.rar

    o JDK 5 or JDK 6 (JRE alone is not sufficient) o Apache Ant 1.6.5 or later for Linux and Mac, 1.7 or later for Windows o Not Not Not Not compatible with Gnu Compiler for Java (gcj) Note: Note: Note: ...

    Android应用程序开发教程PDF电子书完整版、Android开发学习教程

    ① 下载 JDK 5 or JDK 6 (JRE alone is not sufficient) -&gt;安装-&gt;设置环境变量 JAVA_HOME CLASSPATH path ② 下载 Eclipse 3.3 (Europa), 3.4 (Ganymede) IDE for JAVA-&gt;解压 ③ 下载 Android SDK 解压-&gt; path 里...

Global site tag (gtag.js) - Google Analytics