首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java 类库 类加载器 jdk jre 小结

2012-10-13 
java 类库 类加载器 jdk jre 总结。1.类加载器详细资料看:http://www.ibm.com/developerworks/cn/java/j-lo

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\classessun.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

回家再写。

热点排行