获取类加载器的方法:

         //扩展类加载器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获取类加载器相关推荐

  1. java 获取类加载器_java-如何从类加载器获取类路径?

    更新:我下面的原始答案很不充分,因为我花了三年的时间开发FastClasspathScanner,并提交了大量关于某些类路径环境无法使用该库的错误报告. FastClasspathScanner现在可 ...

  2. java中的类加载器有,Java自定义的类加载器,java自定义加载,在java中类加载器有以...

    Java自定义的类加载器,java自定义加载,在java中类加载器有以 在java中类加载器有以下几种java虚拟机自带的加载器 1)根类加载器(Bootstrap,c++实现)2)扩展类加载器(Ex ...

  3. 1.类加载:什么是类加载???什么是类加载器???类加载器有哪三种类型???如何获取类加载器???

    1.类加载:什么是类加载???什么是类加载器???类加载器有哪三种类型???如何获取类加载器??? 学习:第7遍 1.什么是类加载??? 将class文件读取到内存中的过程,称为类加载 2.什么是类加 ...

  4. OSGi 规范和框架 OSGi框架类加载机制 Java默认类加载器机制和OSGI类加载器机制比较

    一.OSGi 规范 OSGi(Open Service Gateway Initiative) 技术是 Java 动态化模块化系统的一系列规范.OSGi 一方面指维护 OSGi 规范的 OSGi Al ...

  5. 2099年了,你知道什么是Java的类加载器嘛?

    Java的类加载器 作用 编译器先把java文件编译成class字节码文件 ClassLoad会把字节码文件转换成jvm中的Class对象 jvm再把class对象转成实例对象 ClassLoad在j ...

  6. Java 自定义类加载器教程

    文章目录 Java 自定义类加载器教程 loadClass findClass defineClass 函数调用过程 Java 自定义类加载器教程 除了在面试中遇到类的加载器的概率会高外,在实际的工作 ...

  7. Java中类加载器获取的两种方式

    import org.junit.Test;import java.io.FileInputStream; import java.io.IOException; import java.io.Inp ...

  8. java自定义类加载器

    import java.io.*;public class MyClassLoader extends ClassLoader{private String loaderName; //类加载器名称p ...

  9. java 自定义类加载器_Java-JVM 自定义类加载器

    一.sun.misc.Launcher (ExtClassLoader 与 AppClassLoader 的创建) publicLauncher() { Launcher.ExtClassLoader ...

最新文章

  1. 字符串编辑距离(Edit Distance)
  2. 自动驾驶高峰激辩:寒冬还有多远,芯片路线之争,人才缺乏待解
  3. php文件上传的经验分享
  4. day20-----------IO流(传智视频)
  5. STC89C52单片机 LCD1602液晶显示屏
  6. 三维重建学习(3):张正友相机标定推导
  7. python键盘输入数组_python 二维数组切割Python读取键盘输入的2种方法
  8. Win7与其它Windows的双系统问题
  9. JSP页面中的pageEncoding和contentType两种属性
  10. Redis为什么是单线程还这么快?
  11. 借款人死亡后,贷款必须由家属偿还吗?
  12. Mysql ---Sqlserver数据迁移到Mysql(Mysql建表迁移数据)
  13. C语言—sort函数比较大小的快捷使用--algorithm头文件下
  14. jquery 高亮插件 highlight
  15. 一辆汽车让你搞懂springmvc项目结构
  16. Python 中的 None 与真假
  17. 如何选择学习主流程序语言(一)
  18. 在Android studio环境下使用junit框架进行单元测试
  19. 使用easyui框架的时候,js和css样式都加载了,但是图标加载不了
  20. 3656. 心与心的距离

热门文章

  1. ios获取手机序列号_iOS7获取设备UDID、IMEI、ICCID、序列号、Mac地址等信息
  2. 服务器系统唤醒,动手实现Ubuntu系统WOL远程唤醒
  3. html 5 中的 6位 十六进制颜色码 代表的意思
  4. OAuth使用教程(一):初识OAuth
  5. 高瑞彬:用科技方式促进商业新秩序
  6. Ubuntu12.04连接HTC G11
  7. 本宝宝不开森,才不要学什么 JS
  8. 【笔记】行测——图形推理总结与归纳
  9. Linux终端模式常用软件
  10. PopupWindow EditText 无法输入