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
回家再写。
分享到:
相关推荐
### Java 类加载器详解 #### 一、类加载器概述 在Java中,类加载器(Class Loader)是一项核心机制,用于将字节码(.class文件)加载到JVM中,使其成为运行时的对象。类加载器不仅实现了类的加载功能,还确保了...
Bootstrap ClassLoader是JVM启动时的第一个类加载器,负责加载JDK的`<JAVA_HOME>/jre/lib`目录下的核心类库。Extension ClassLoader加载`<JAVA_HOME>/jre/lib/ext`目录下的扩展类库。AppClassLoader(也叫System ...
2. **Extension ClassLoader**: 这个类加载器负责加载扩展的Java类库(例如所有以`javax.*`开头的类以及存放在JRE的`ext`目录下的类)。它是一个Java类,继承自`java.lang.ClassLoader`。 3. **Application ...
2. **extension class loader**:扩展类加载器,负责加载JDK的扩展目录(如`$JAVA_HOME/jre/lib/ext`)中的类库。开发者可以通过这个目录添加自定义的JAR文件来扩展Java的功能。 3. **system/app class loader**:...
Java 类加载器是Java虚拟机(JVM)的核心组成部分,它负责将编译后的字节码文件(.class文件)加载到JVM中并转换为运行时的数据结构。Tomcat,作为广泛使用的Java Servlet容器,它自定义了一套类加载机制,以满足Web...
JDK Java SE Development kit(JDK) java开发工具包 ...JVM是运行java程序的核心虚拟机,还需要其他的类加载器,字节码校验器,以及大量的基础类库。JRM除了包含JVM之外,还包含运行java程序的其它环境支持。
- **JRE与JDK的区别**:JRE(Java Runtime Environment)包含了运行Java程序所需的基本组件,而JDK(Java Development Kit)则是在JRE基础上增加了编译器、调试器以及其他开发工具,是用于开发Java应用程序的完整...
根类加载器,也称为bootstrap class loader,是JVM内置的最基础的类加载器,由C++实现,负责加载JDK核心库,如rt.jar,这些库位于JRE的lib目录下,包含了Java的基础类和API。 扩展类加载器,又叫extension class ...
1. **引导类加载器(Bootstrap Class Loader)**:由C++实现,启动JVM时初始化,主要加载JDK核心类库,如%JAVA_HOME%\jre\lib下的rt.jar,以及-Xbootclasspath指定的路径中的类。 2. **扩展类加载器(Extension ...
类加载器的概念始于JDK 1.0,最初是为了解决Java Applet在浏览器中的运行需求,而现在它在Web容器和模块化系统如OSGi中扮演着至关重要的角色。 类加载器工作流程通常涉及以下几个步骤: 1. **加载**:加载阶段,类...
- JDK(Java Development Kit)的安装是调用Java类库的前提。按照步骤安装JDK,并确保在系统的PATH环境变量中添加JDK和JRE的bin目录,以便系统能够找到Java命令。 - 测试JDK安装是否成功,可以在命令行输入`java -...
1. **JDK** 包含了JRE,并增加了开发工具,如编译器、调试器等,主要用于开发Java应用程序。 2. **JRE** 包含了JVM和核心类库,主要用于运行已编译的Java程序。 3. **JVM** 是JRE的核心部分,负责解释执行Java字节码...
Java中的类加载器分为三个主要层次:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和系统类加载器(AppClassLoader)。启动类加载器负责加载JRE核心库,如`rt.jar`;扩展类加载器...
2. 扩展类加载器(Extension ClassLoader):加载JDK的`jre/lib/ext`目录下的JAR文件或系统属性`java.ext.dirs`指定的目录下的类库。 3. 应用程序类加载器(Application ClassLoader):也称为系统类加载器,负责...
2. **扩展类加载器(Extension ClassLoader)**:由Java编写,负责加载JRE的扩展库,这些类库位于`jre/lib/ext`目录下的JAR文件。扩展类加载器的父加载器是引导类加载器,尽管在Java中它表现为`null`。 3. **系统类...
Java类加载器分为三种主要类型:引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader,也称为系统类加载器)。它们共同工作,确保了Java...
1. **引导类加载器(Bootstrap ClassLoader)**:这是JVM自带的第一类加载器,负责加载JRE核心库,如rt.jar、charsets.jar等,这些位于JDK安装目录下的jre/lib/下的核心类库。 2. **扩展类加载器(Extension ...