java ClassLoader / 显示classLoader 名字 / 层次关系
2016-01-05 20:10
603 查看
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()机制可以防止这种病毒类被加载
}
}
![](https://img-blog.csdn.net/20160112111950318?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图1 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 层次关系图
相关文章推荐
- 关于接口的几点问题
- java程序调用mysql存储过程
- myEclipse 界面窗口打不开问题
- 【java】:关于private型的理解
- myeclipse+maven
- 原来Java中有两个ArrayList
- Spring4实战(二)-Quartz 2.2 集成
- Spring框架学习之IOC(一)
- Java设计模式——适配器模式
- Java设计模式——适配器模式
- java 位数补0处理(转)
- java里 对线程的wait方法只有在synchronized下才有用吗?
- Java线程同步 (synchronized wait notify)
- java成员变量与局部变量
- Itellij IDEA启动报错
- Eclipse Java注释模板设置详解
- java classloader详解
- java集合:链表
- myeclipse2014版安装freemarker IDE
- java系列--MD5加密