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
回家再写。
分享到:
相关推荐
JDK Java SE Development kit(JDK) java开发工具包 ...JVM是运行java程序的核心虚拟机,还需要其他的类加载器,字节码校验器,以及大量的基础类库。JRM除了包含JVM之外,还包含运行java程序的其它环境支持。
JDK全称Java SE Development kit(JDK),即java标准版开发包,是Oracle提供的一套用于开发java应用程序的开发包,它提供编译,运行java程序所需要的各种工具和资源,包括java编译器,java运行时环境,以及常用的java...
作为最常用的 Java 软件开发套件(SDK),JDK 的第一手组件包括 Java 应用程序的加载器(简称为 Java),即由编译器(javac)创建的类文件的解释器,该编译器本身就是源代码。从原始格式到 Java 字节码的代码,以及...
作为最常用的 Java 软件开发套件(SDK),JDK 的第一手组件包括 Java 应用程序的加载器(简称为 Java),即由编译器(javac)创建的类文件的解释器,该编译器本身就是源代码。从原始格式到 Java 字节码的代码,以及...
CLASSPATH:类加载器使用 让类加载器明确去哪里加载.class文件 通常不需要设置 默认值:. .:当前目录(.java) CLASSPATH相当于中国的低保制度 JAVA_HOME:其他的程序使用 WEB 设置方式: 1:一次性的设置 ...
这3个加载器分别对应着编译器去寻找类文件的优先级别和不同的路径:BootClassLoader对应jre/classes路径,是编译器最优先寻找class的地方 ExtClassLoader对应jre/lib/ext路径,是编译器次优先寻找class的地方 ...
面试问题整理:JVMJRE、JDK、JVM,JVM :英文名称(Java Virtual Machine),就是我们耳熟能详的 Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的...
疯狂的java讲义 源码 这是Java学习中的一些代码以及...JRE:Java运行时环境,它包含了JVM(Java虚拟机)还有类加载器、字节码校验器以及大量的基础类库。 6 2018-10-30 Java集合,HashSet和TreeSet(无序和有序) 7 2
3、JVM中的类加载器加载字节码文件 4、JVM中的执行引擎找到入口方法main(),执行其中的方法 一、JDK、JRE、JVM区别与联系 JDK是 Java 语言的软件开发工具包(SDK)。在JDK的安装目录下有一个jre目录,里面有两个文件夹...
《Java开发实战1200例》分为I、II两卷共计1200个例子,包括了开发中各个方面最常用的实例,是目前市场上实例最全面的开发类图书;书中实例来源于多位工程师的多年积累,具有很强的实用性。 本书是第II卷,以开发...
Java 虚拟机面试题全面解析,《深入理解Java虚拟机》干货版,自己总结,希望能够帮助大家,免费下载~什么是类加载机制? 虚拟机和物理机的区别是什么? 运行时栈帧结构 Java方法调用 什么是方法调用? Java的方法调用,...
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: ...
① 下载 JDK 5 or JDK 6 (JRE alone is not sufficient) ->安装->设置环境变量 JAVA_HOME CLASSPATH path ② 下载 Eclipse 3.3 (Europa), 3.4 (Ganymede) IDE for JAVA->解压 ③ 下载 Android SDK 解压-> path 里...