java反射机制剖析(二)— Class Loader
来源:互联网 发布:世界各国基尼系数数据 编辑:程序博客网 时间:2024/05/16 15:43
上一篇博客简要的提了一下java反射机制中涉及到的一些相关知识,那么ClassLoader就是其中之一。本篇博客就详细的对ClassLoader做一个相对深入的了解。作为了解需要知道的是,其实类类型(Class Class)是和ClassLoader分不开的,因为ClassLoader需要的信息是由它提供的。类类型将在下一篇博客介绍。
注意:数组类的 Class 对象不是由类加载器创建的,而是由 Java 运行时根据需要自动创建。数组类的类加载器由 Class.getClassLoader() 返回,该加载器与其元素类型的类加载器是相同的;如果该元素类型是基本类型,则该数组类没有类加载器。
Bootstrap ClassLoader:是用C++编写的,是JVM的内置加载器,它的名字是null。它用来加载核心类库,即在lib下的类库。做个实验,首先,String类肯定是java的核心类,那我们就以它为例来看看:
Extension ClassLoader:加载lib/ext下的类库。
App ClassLoader:加载Classpath里的类库。
我们这里可以在做一个实验,来体会一下这个层次关系。代码如下:
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
很绕啊,文字说不清楚还是上图吧!
双亲加载机制可以一定程度上保证安全性,因为只要顶层ClassLoader能加载的东西就一定不会让下层的ClassLoader有机会加载。也就保证了有些自定义的带有破坏性的类不会被加载到Jvm核心中。
结语:ClassLoader相对难理解的地方一个是,对象将的层次关系和父加载器。另一个是双亲加载机制。这里提供一个视频供大家参考。
简介
ClassLoader是负责加载类的对象,作用是根据Jvm请求提供的类信息,将请求的类加载的内存中或者说加载到Jvm中。另外,每一个类的Class对象(注意Class是类类型)都持有一个对应的ClassLoader的引用。可以通过Class对象的getClassLoader()方法得到。类和它的ClassLoader是对应的,所以类只能通过它对应的ClassLoader加载。注意:数组类的 Class 对象不是由类加载器创建的,而是由 Java 运行时根据需要自动创建。数组类的类加载器由 Class.getClassLoader() 返回,该加载器与其元素类型的类加载器是相同的;如果该元素类型是基本类型,则该数组类没有类加载器。
分类
JVM在运行时会产生三个ClassLoader,Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader。Bootstrap ClassLoader:是用C++编写的,是JVM的内置加载器,它的名字是null。它用来加载核心类库,即在lib下的类库。做个实验,首先,String类肯定是java的核心类,那我们就以它为例来看看:
public static void main(String[] args){String a="x";System.out.println(a.getClass().getClassLoader());}我们通过代码来获得String加载对应的ClassLoader的名字输出的结果为NULL。
Extension ClassLoader:加载lib/ext下的类库。
App ClassLoader:加载Classpath里的类库。
层次关系
之前我们说过,每一个Class对象都会持有一个对应的ClassLoader的引用。每一个ClassLoader对象也会持有一个Parent ClassLoader的引用。这里需要特别注意的是:这里所指的的Parent ClassLoader不是我们熟悉的继承关系,不是父类!!首先,我们要知道这里说的是ClassLoader对象,也就是说这的Parent ClassLoader其实是一个对象的引用。下面看一张图,了解一下ClassLoader对象之间的层次关系:我们这里可以在做一个实验,来体会一下这个层次关系。代码如下:
public static void main(String[] args){ClassLoader c =TestClassLoader.class.getClassLoader();do {System.out.println(c.getClass().getName());c=c.getParent();}while(c!=null);}}输出的结果为:
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
双亲加载机制
层次关系中我们了解到了很重要的一点:加载器对象之间的引用关系。被引用的对象称之为引用对象的父加载器,可以通过getParent()方法得到。那么双亲加载机制就是基于这种引用的层次关系。即:当一个ClassLoader接到请求时,它不是直接加载对应的类,而是询问它引用的ClassLoader是否能够加载,而这个父ClassLoader则会询问自己的引用的ClassLoader是否加载了该类。只有当所有的父ClassLoader都没有加载该类时,这个最初的ClassLoader才自己去加载申请的类。很绕啊,文字说不清楚还是上图吧!
双亲加载机制可以一定程度上保证安全性,因为只要顶层ClassLoader能加载的东西就一定不会让下层的ClassLoader有机会加载。也就保证了有些自定义的带有破坏性的类不会被加载到Jvm核心中。
结语:ClassLoader相对难理解的地方一个是,对象将的层次关系和父加载器。另一个是双亲加载机制。这里提供一个视频供大家参考。
5 1
- java反射机制剖析(二)— Class Loader
- java反射机制剖析(二)— Class Loader
- java反射机制剖析— Class Loader
- java反射机制剖析(三)—类类型Class
- Java反射——Class Loader
- Java反射机制剖析(二)-功能以及举例
- Java反射机制剖析(二)-功能以及举例
- Java反射机制剖析(二)-功能以及举例
- Java反射机制剖析(二)-功能以及举例
- Java反射机制剖析(二)-功能以及举例
- Java反射机制剖析(二)-功能以及举例
- Java反射机制剖析(二)-功能以及举例
- Java核心代码(二)Class loader
- Java反射机制——Class类的介绍(二)
- java 反射机制剖析
- JAVA 反射机制剖析
- Java反射机制剖析
- Java反射机制剖析
- struts2整合CKEditor和CKFinder,图片上传失败问题
- java 多线程并行求和 之 join() 方法应用
- 静态变量和动态变量 堆和栈
- IE 首页锁定
- linux安装 花生壳
- java反射机制剖析(二)— Class Loader
- memcached的线程模型
- 2014年8月25日 高铁时代
- Hibernate不能自动建表 关于数据库方言设置
- CXF学习:客户端
- Android UI库整理
- 关于java图片切割的小demo
- weblogic和tomcat区别
- 计算每个月的前六个月内的累计值