java获取类加载器
获取类加载器的方法:
//扩展类加载器MainClassLoader classLoader = MainTest.class.getClassLoader();//表示当前线程的类加载器——应用程序类加载器ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();//—启动类加载器ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
在一个简单的main方法中,返回对应的类加载器是相同的:
在类加载器双亲委派模型中(可看本文后面的双亲委派模型介绍),应用程序加载器的定义是:这个类加载器由sun.misc.Launcher$AppClassLoader加载实现。spring的类加载器的类型为“”应用程序加载器“”怎么看出来的呢。下图:
这个类加载器是什么时候设置的呢?看DefaultResourceLoader的无参构造函数,在类初始化时设置的。
public DefaultResourceLoader() {this.classLoader = ClassUtils.getDefaultClassLoader();
}
可以进一步查看类加载器的生成。进入ClassUtils.getDefaultClassLoader()方法如下。
public static ClassLoader getDefaultClassLoader() {ClassLoader cl = null;try {cl = Thread.currentThread().getContextClassLoader();}catch (Throwable ex) {// Cannot access thread context ClassLoader - falling back...}if (cl == null) {// No thread context class loader -> use class loader of this class.cl = ClassUtils.class.getClassLoader();if (cl == null) {// getClassLoader() returning null indicates the bootstrap ClassLoadertry {cl = ClassLoader.getSystemClassLoader();}catch (Throwable ex) {// Cannot access system ClassLoader - oh well, maybe the caller can live with null...}}}return cl;}
2、 双亲委派模型介绍(摘自《深入理解java虚拟机》虚拟机类加载机制)
类加载器的双亲委派模型,如下图所示,双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。这里类加载器之间的父子关系一般不会以继承的关系来实现,而是都使用组合关系来复用父加载器。spring中提供的方法 getDefaultClassLoader()就是使用组合关系来复用父类加载器。
双亲委派模型的工作过程是:如果一个类加载器收到了类加载请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。
从java虚拟机的角度讲,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),由C++实现,另一种就是所有其它的加载器,是由java实现的,独立于虚拟机外部,并且全都继承自java.lang.ClassLoader。
从java开发人员来讲,类加载器还可以划分的更细致一些:
1、 启动类加载器(Bootstrap ClassLoader):这个类加载器负责将存放在<JAVA_HOME>\lib目录中,或者被-XbootClasspath参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符合的类库即使放在lib目录中也不会被加载)类库加载到虚拟机内存中。启动类加载器无法直接被java程序引用,用户在编写自定义类加载器时,如果需要把加载请求委派给引导类加载器,那直接使用null代替即可。
2、 扩展类加载器(Extension ClassLoader):这个加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载<JAVA_HOME>\lib\ext目录中,或者被java.ext.dirs系统变量所指定的路径中的类库,开发者可以直接使用扩展类加载器。
3、 应用程序类加载器(Application ClassLoader):这个类加载器由sun.misc.Launcher$AppClassLoader实现。由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,所以一般也称它为系统类加载器,它负责加载用户类路径(classpath)上指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中的默认类加载器。
来源:CSDN
原文:https://blog.csdn.net/sum__mer/article/details/52589762
java获取类加载器相关推荐
- java 获取类加载器_java-如何从类加载器获取类路径?
更新:我下面的原始答案很不充分,因为我花了三年的时间开发FastClasspathScanner,并提交了大量关于某些类路径环境无法使用该库的错误报告. FastClasspathScanner现在可 ...
- java中的类加载器有,Java自定义的类加载器,java自定义加载,在java中类加载器有以...
Java自定义的类加载器,java自定义加载,在java中类加载器有以 在java中类加载器有以下几种java虚拟机自带的加载器 1)根类加载器(Bootstrap,c++实现)2)扩展类加载器(Ex ...
- 1.类加载:什么是类加载???什么是类加载器???类加载器有哪三种类型???如何获取类加载器???
1.类加载:什么是类加载???什么是类加载器???类加载器有哪三种类型???如何获取类加载器??? 学习:第7遍 1.什么是类加载??? 将class文件读取到内存中的过程,称为类加载 2.什么是类加 ...
- OSGi 规范和框架 OSGi框架类加载机制 Java默认类加载器机制和OSGI类加载器机制比较
一.OSGi 规范 OSGi(Open Service Gateway Initiative) 技术是 Java 动态化模块化系统的一系列规范.OSGi 一方面指维护 OSGi 规范的 OSGi Al ...
- 2099年了,你知道什么是Java的类加载器嘛?
Java的类加载器 作用 编译器先把java文件编译成class字节码文件 ClassLoad会把字节码文件转换成jvm中的Class对象 jvm再把class对象转成实例对象 ClassLoad在j ...
- Java 自定义类加载器教程
文章目录 Java 自定义类加载器教程 loadClass findClass defineClass 函数调用过程 Java 自定义类加载器教程 除了在面试中遇到类的加载器的概率会高外,在实际的工作 ...
- Java中类加载器获取的两种方式
import org.junit.Test;import java.io.FileInputStream; import java.io.IOException; import java.io.Inp ...
- java自定义类加载器
import java.io.*;public class MyClassLoader extends ClassLoader{private String loaderName; //类加载器名称p ...
- java 自定义类加载器_Java-JVM 自定义类加载器
一.sun.misc.Launcher (ExtClassLoader 与 AppClassLoader 的创建) publicLauncher() { Launcher.ExtClassLoader ...
最新文章
- 字符串编辑距离(Edit Distance)
- 自动驾驶高峰激辩:寒冬还有多远,芯片路线之争,人才缺乏待解
- php文件上传的经验分享
- day20-----------IO流(传智视频)
- STC89C52单片机 LCD1602液晶显示屏
- 三维重建学习(3):张正友相机标定推导
- python键盘输入数组_python 二维数组切割Python读取键盘输入的2种方法
- Win7与其它Windows的双系统问题
- JSP页面中的pageEncoding和contentType两种属性
- Redis为什么是单线程还这么快?
- 借款人死亡后,贷款必须由家属偿还吗?
- Mysql ---Sqlserver数据迁移到Mysql(Mysql建表迁移数据)
- C语言—sort函数比较大小的快捷使用--algorithm头文件下
- jquery 高亮插件 highlight
- 一辆汽车让你搞懂springmvc项目结构
- Python 中的 None 与真假
- 如何选择学习主流程序语言(一)
- 在Android studio环境下使用junit框架进行单元测试
- 使用easyui框架的时候,js和css样式都加载了,但是图标加载不了
- 3656. 心与心的距离