java 类加载机制学习

系统类加载器的学习


package com.easyway.commons.ispace.dev.oop.classloaders;
/**
 * 系统类加载器的学习:
 * 类加载器用来把类加载到java虚拟机中。从JDK1.2中,类的加载过程采用父类委
 * 托机制能更好地保障java平台的安全,再次委托机制中,除了Java虚拟机自带的
 * 根类加载器以外,其余的类加载器都有且只有一个父加载器,当java程序请求加
 * 载器loader1加载sample类时,loader1首先委托自己的父加载器去加载sample类。
 * 若父加载器能加载,则有父加载器完成加载任务,否则才由加载器loader1本身加载sample类。
 * java虚拟机自带以下几种加载器:
 *  1)根(Bootstrap)类加载器:该加载器没有父加载器。它负责加载虚拟机的核心类库,如java.lang.*等。
 *    java.lang.Object就是由根类加载器加载的。根类加载器从系统属性sun.boot.class.path所指定目录中加载类库。
 *    根类加载器的实现依赖于底层操作系统,属于虚拟机的实现的一部分,并没有继承java.lang.ClassLoader类。
 *  2)扩展类加载器:他的父类加载器为根类加载器,它从java.ext.dirs系统属性所指定的目录中加载类库,
 *  或者从JDK的安装目录中jre\lib\ext子目录(扩展目录)下加载类库。如果把用户创建的jar文件放在这个目录下,
 *  也会自动有扩展类加载器加载,扩展类加载器是纯java类,是java.lang.ClassLoader类的子类。
 *  3)系统(System)类加载器,也成为应用加载器,它的父加载器为扩展加载器,它从环境变量classpath或者系
 *  统属性java.class.path所指定的目录中加载类,它是用户自定义的类加载器的默认父加载器。
 *  系统类加载器是纯java类,是java.lang.ClassLoader类的子类。
 * @author longgangbai
 * @date 2010-5-7
 * @version 1.0
 * @since JDK6.0
 */
public class SystemClassLoad {
	/**
	 * 打印结果(按打印输出顺序)如下:
	 * sun.misc.Launcher$AppClassLoader@19821f 
	 * 说明系统的类加载器实例
	 * 
	 * sun.misc.Launcher$AppClassLoader@19821f's parent is  sun.misc.Launcher$ExtClassLoader@addbf1
	 * 说明:系统 类加载器的父加载器为扩展类加载器
	 * 
	 * sun.misc.Launcher$ExtClassLoader@addbf1's parent is  null  
	 * 说明:扩展的类的加载器的父加载器为根类加载器,不过,java虚拟机并不会为java程序提供根类加载器的引用,
	 * 而是用null来表示根类加载器。这样做是为了包含java虚拟机的安全,防止黑客利用根类加载器来加载非法的泪,
	 * 从而破坏java虚拟机的核心代码。
	 * 
	 * java.lang.Object's loader is null
	 * 说明:java.lang.Object 是由根类加载器加载的
	 * 
	 * SystemClassLoad's loader is sun.misc.Launcher$AppClassLoader@19821f
	 * 说明: 用户类是由系统类加载器加载的 
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		Class c;
		ClassLoader c1,c11;
		//获取系统的类加载器实例 sun.misc.Launcher$AppClassLoader@19821f  
		c1=ClassLoader.getSystemClassLoader();
		System.out.println(c1);
		while(c1!=null){
			c11=c1;
			//获取系统 类加载器的父加载器为扩展类加载器即  
			// sun.misc.Launcher$AppClassLoader@19821f's parent is  sun.misc.Launcher$ExtClassLoader@addbf1
			c1=c1.getParent();
			System.out.println(c11+"'s parent is  "+c1);
		}
		try {
			c=Class.forName("java.lang.Object");
			c1=c.getClassLoader();
			System.out.println("java.lang.Object's loader is "+c1);
			
			
			c=Class.forName("com.easyway.commons.ispace.dev.lang.classloader.SystemClassLoad");
			c1=c.getClassLoader();
			System.out.println("SystemClassLoad's loader is "+c1);
			
		} catch (Exception e) {
	      e.printStackTrace();
		}
	}
}

 

你可能感兴趣的:(java,c,虚拟机,ext,sun)