类加载的原理

 
/**
 * Java虚拟机中可以安装多个类加载器,
 * 系统默认三个主要类加载器,
 * 每个类负责加载特定位置的类:
 * BootStrap,ExtClassLoader,AppClassLoader
 * 类加载器也是Java类,
 * 因为其他是java类的类加载器本身也要被类加载器加载,
 * 显然必须有第一个类加载器不是不是java类,
 * 这正是BootStrap。
 * 
 * BootStrap   加载的是JRE/lib/rt.jar里面的类
   ExtClassLoader      JRE/lib/ext/*.jar
   AppClassLoader    CLASSPATH指定的所有jar或目录
 * 
 * 
 * 
 * 在两种情况下运行这段代码:
 * ClassLoader  loader = ClassLoaderTest.class.getClassLoader();
 * 		while(loader != null){
			System.out.println(loader.getClass().getName());
			loader = loader.getParent();
		}
		System.out.println(loader);
	1.直接在运行main方法,然后打印:
	    	* 下面是打印的结果:
		 * sun.misc.Launcher$AppClassLoader
			sun.misc.Launcher$ExtClassLoader
			null
	从这里可以看出,AppClassLoader的父类是ExtClassLoader,ExtClassLoader类的父类为null,那么是由BootStrap生产的
	
 * 2.将这个工程打成jar包,放到D:\Java\jdk1.6.0_10\jre\lib\ext
 * 下面,取名为mytest.jar,然后运行的结果为
	sun.misc.Launcher$ExtClassLoader
	null
	从这里可以看出,ExtClassLoader加载的是JRE/lib/ext/*.jar里面的类
	
	
	这里犯得错误:
	一:MyEclipse下面的JRE环境不是自己电脑里面所装的环境
	所以经过很过次试验之后会发现运行结果还是和没有导入时是一样的
	
	改正;run as Configration  把里面的jre环境改掉,改成自己电脑里面所装得
	然后再运行,结果就出来了
	
	
	
	每个ClassLoader本身只能分别加载特定位置和目录中的类,
	但它们可以委托其他的类装载器去加载类,这就是类加载器的委托模式。
	类装载器一级级委托到BootStrap类加载器,
	当BootStrap无法加载当前所要加载的类时,
	然后才一级级回退到子孙类装载器去进行真正的加载。
	当回退到最初的类装载器时,如果它自己也不能完成类的装载,那就应报告ClassNotFoundException异常。

	每个类加载器加载类时,又先委托给其上级类加载器。
	当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,
	不是再去找发起者类加载器的儿子,因为没有getChild方法,
	即使有,那有多个儿子,找哪一个呢?
	
	对着类加载器的层次结构图和委托加载原理,
	解释先前将ClassLoaderTest输出成jre/lib/ext目录下的itcast.jar包中后,
	运行结果为ExtClassLoader的原因。

 *
 */
public class ClassLoaderTest {
	public static void main(String[] args) {
		ClassLoader  loader = ClassLoaderTest.class.getClassLoader();
		String name = loader.getClass().getName();
		System.out.println(name);//sun.misc.Launcher$AppClassLoader
		
		
		ClassLoader  loader2 = System.class.getClassLoader();
		//String name2 = loader2.getClass().getName();//nullpointerException,说明这个类是有BootStartup加载的
		//System.out.println(name2);//sun.misc.Launcher$AppClassLoader

		while(loader != null){
			System.out.println(loader.getClass().getName());
			loader = loader.getParent();//得到加载器的父类
		}
		System.out.println(loader);

	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值