java ClassLoader / 显示classLoader 名字 / 层次关系

java 三种 classLoader

public void classLoaderTest(){
	//0.扫盲,获取Class 对象两种方法
	Iplong iplong = new Iplong("li", "jia");
	System.out.println(Iplong.class);   //class test.java.Iplong  上下等价 ,获取类的Class 对象,用类名.class获取
	System.out.println(iplong.getClass());//class test.java.Iplong  用对象名的getClass()函数返回此 Object 的运行时类
	//1.显示bootstrap classLoader 的方法
	System.out.println(String.class.getClassLoader());//输出null,这个是bootstrap classLoader 你打印不出来他的名字
	//sun.misc.Launcher$ExtClassLoader,这个是extension classLoader,\jdk1.7.0_60\jre\lib\ext这个目录下的类被其加载,
	//2.显示extension classLoader (BlowfishCipher 类被他加载 )
	System.out.println(BlowfishCipher.class.getClassLoader().getClass().getName());
	//3.显示application classLoader,自己写的类被他加载
	System.out.println(TestJDKClassLoader.class.getClassLoader().getClass().getName());//sun.misc.Launcher$AppClassLoader
	//4.拿到系统的classLoader,也就是application classLoader,
	System.out.println(ClassLoader.getSystemClassLoader().getClass().getName());//sun.misc.Launcher$AppClassLoader
	//5.输出bootstrap classLoader,bootstrap class Loader 把其他的classLoader load 进来,其他的 classLoader 再去load 其他class
	//以下两个都是bootstrap classLoader,这说明了ext classLoader 和app classLoader 都是被BootStrap classLoader加载的。注意,getParent()是app classLoader
	//保存的指向ext classLoader 的引用
	System.out.println(ClassLoader.getSystemClassLoader().getClass().getClassLoader());//null 即bootstrap classLoader,
	System.out.println(ClassLoader.getSystemClassLoader().getParent().getClass().getClassLoader());//null 即bootstrap classLoader,
	
	//ClassLoader的 getParent() 方法,这个方法体现的不是类继承,是对象与对象(ClassLoader在这里被实例化成一个个对象)之间的关系。是一种层次关系
	ClassLoader c = TestJDKClassLoader.class.getClassLoader();
	while(c!=null)
	{
		System.out.println(c.getClass().getName());//输出 sun.misc.Launcher$AppClassLoader  sun.misc.Launcher$ExtClassLoader
		c = c.getParent();//classLoader 会先去问他的parent ,你是不是加载了这个类,如果加载了,我就不继续加载了。
					//可以保证安全性,防止有人写一个java.lang.String,其中有病毒,然后自己写一个类加载器去加载这个病毒
					//此getParent()机制可以防止这种病毒类被加载
	}
}



图1 classLoader 层次关系图






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值