获取类加载器的方法:

         //扩展类加载器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. 关于SQL Server下无限多级别分类查询解决办法
  2. CVPR 2022 | ConvNeXt - FAIR再探纯卷积结构的极限(优于Transformer)
  3. 《虚拟化与云计算》第4章 虚拟化的业界动态
  4. Tomcat 之 tomcat安装和组件介绍
  5. PDF批量替换文字器免费版
  6. windows php postgre,windows下php不支持pgsql的解决方法
  7. 五分钟完成 ABP vNext 通讯录 App 开发
  8. JqGrid 列时间格式化
  9. Nature综述|整合组学分析护航健康,推动精准医学时代的到来!
  10. 斗破苍穹手游找不到以前服务器,斗破苍穹手游服务器爆满怎么进 服务器爆满进入方法[图]...
  11. android 音视频录制
  12. 交换机vtp功能配置
  13. PythonStock(37)股票系统:Python股票系统发布V2.0版本,改个名字吧,叫Python全栈股票系统2.0,可以实现数据的抓取(akshare),统计分析,数据报表展示。
  14. 谁说待国企就是养老?前阿里P8总结500页Java成长笔记全网首发!爱了爱了!
  15. 数据分析师三个等级_数据分析课|这三个等级的数据分析师报考条件,一定是你需要的...
  16. 怎么提升个人的代码编写能力
  17. WebDAV之葫芦儿·派盘+FX文件管理器
  18. 繁体简体转换的python包pylangtools
  19. ocp|ocm考证系列文章!
  20. R语言绘图patchwork拼图详解快速实现组合图拼接

热门文章

  1. H5Audio音频案例
  2. 2023年全国最新高校辅导员精选真题及答案28
  3. 《西河大鼓——调寇》(唱词文本)
  4. 用MRTG监测Linux系统网络、CPU、内存和硬盘情况 1
  5. ORA-38706: Cannot turn on FLASHBACK DATABASE logging.ORA-38709: Recovery Area is not enabled.
  6. ros(22):catkin_make可以加多线程/多核、catkin_make -j4、catkin_make -j8、catkin_make -j12、catkin_make -j16
  7. ubuntu重启黑屏光标闪烁(系统无法启动独立显卡)
  8. 企业微信回调接口验签
  9. Python小白练习之判断周几
  10. hive报错--code1/2/3