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

[b]1.类加载器[/b]

详细资料看:[u]http://www.ibm.com/developerworks/cn/java/j-lo-classloader/[/u]
节选:
[i] 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类的方式实现自己的类加载器,以满足一些特殊的需求。[/i]
虚拟机在运行一个类时,需要将其装入内存,虚拟机搜索类的方式和顺序如下:  Bootstrap classes,Extension classes,User classes。
那么到底三个加载器加载的class具体在什么位置?看下节。

[b]2.类库[/b]

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

在结合库目录截图来说明:
[img]http://dl.iteye.com/upload/picture/pic/102144/a58310dc-0e6a-3b89-9fc4-38bc2c175666.jpg[/img]
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,这样控制台能显示出详细的类加载过程。

[b]3.dk和jre[/b]

回家再写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值