类加载器有一种父/子关系。除了引导类加载器外,每个类加载器都有一个父类加载器。本章通过分析ClassLoader的源码来展示java类加载器的层次结构。

根据规定,类加载器会为它的父类加载器提供一个机会,以便加载任何给定的类,并且只有在其父类加载器加载失败时,它才会加载该给定类。如:系统类加载器加载ArrayList类时,会首先让其父类加载器扩展类加载器进行加载,扩展类加载器会让其父类加载器引导类加载器进行加载,当其中任意一个加载器加载成功就返回Class对象。

ClassLoader的loadClass方法代码如下(这是jdk1.7的源码):protected Class> loadClass(String name, boolean resolve)

throws ClassNotFoundException

{

synchronized (getClassLoadingLock(name)) {

// First, check if the class has already been loaded

// 检查类是否已经被加载

Class c = findLoadedClass(name);

if (c == null) {

long t0 = System.nanoTime();

try {

if (parent != null) {

// 如果父类加载器不等于null,则使用父类加载器进行加载

c = parent.loadClass(name, false);

} else {

// 如果父类加载器等于null,则使用引导类加载器进行加载

c = findBootstrapClassOrNull(name);

}

} catch (ClassNotFoundException e) {

// ClassNotFoundException thrown if class not found

// from the non-null parent class loader

}

if (c == null) {

// If still not found, then invoke findClass in order

// to find the class.

long t1 = System.nanoTime();

// 如果该类加载器的所有父类加载器都没有加载成功,则使用当前类加载器进行加载

c = findClass(name);

// this is the defining class loader; record the stats

sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);

sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);

sun.misc.PerfCounter.getFindClasses().increment();

}

}

if (resolve) {

resolveClass(c);

}

return c;

}

}

某些程序具有插件的结构,通过配置文件指定动态的方式从jar文件中加载某个类,此时我们就可以使用URLClassLoader类加载器进行加载,如下:URL url = new URL("file:///D:/test/test.jar");

URLClassLoader myLoader = new URLClassLoader(new URL[]{ url});

Class> clazz = myLoader.loadClass("com.bug315.Test");

因为在URLClassLoader中没有指定父类加载器,因此URLClassLoader默认使用系统类加载器(AppClassLoader)作为父类加载器。

java引导类加载器_Java类加载器层次结构(一)相关推荐

  1. java 类加载器_Java 类加载器

    一.概述 类加载器通过一个类的全限定名来获取描述此类的二进制字节流. 类加载器在类层次划分.OSGi.热部署.代码加密等领域发挥着重要的作用. 比较两个类是否"相等",只有在这两个 ...

  2. java classloader详解_Java类加载器(ClassLoader)详解

    本文主要讲述Java ClassLoader的工作原理,这为后面将Android App代码热替换或者插件化升级做铺垫 一. 类加载器 ClassLoader即常说的类加载器,其功能是用于从Class ...

  3. java class加载_Java 类加载

    从一个诡异的问题说起 测试案例一: packageecut.classloader;public classSun {protected static int a = 100;protected st ...

  4. java 装饰器_JAVA装饰器模式

    Java程序员们应该对java.io对不会陌生,因为java.io包采用了装饰器模式. 一.定义: Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样 ...

  5. java类加载器_JAVA类加载器

    虚拟机设计团队把加载动作放到 JVM 外部实现,以便让应用程序决定如何获取所需的类,JVM 提 供了 3 种类加载器: 1. 启动类加载器(Bootstrap ClassLoader) 负责加载 JA ...

  6. java log4j 热部署_JAVA类加载器分析--热部署的缺陷(有代码示例,及分析)

    首先纠正一个误区: 热部署不是我们在Eclipse里面修改了代码不用重启就可以持续调试. 详情可以参考上一篇博文: 热部署和"Hot Code Replace"的区别    htt ...

  7. java 媒体播放器_Java多媒体播放器(三)

    No.3 vlcj 一.简介 The vlcj project first gives you Java bindings to just about all of the native functi ...

  8. java类加载 复制_Java 类加载全过程

    类加载的机制可以分为如下几步: 1.加载:将class字节文件码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法 ...

  9. java 文件分割器_Java分割器

    java 文件分割器 Java Spliterator is one of the four iterators – Enumeration, Iterator, ListIterator and S ...

最新文章

  1. pku1384---Piggy-Bank(动态规划)
  2. Android开发之异步任务加载网络图片并存储在sdcard中(源代码分享)
  3. redirect_uri参数错误解决方法
  4. 计算机网络总线型结构优,计算机基础知识:计算机网络总线型拓扑结构的概述及优缺点...
  5. P4144 大河的序列
  6. labelImg重新开启工具箱(栏)
  7. linux挂载硬盘_Linux把内存挂载成硬盘提高读写速度-内存虚拟盘
  8. MATLAB数值计算笔记
  9. MSI Afterburner 官网链接指南
  10. Java实现多张图片转pdf
  11. 国家科技管理信息系统构建及其对科技情报工作的影响
  12. Webpack打包警告: We noticed you're using the `useBuiltIns` option without declaring a core-js version.
  13. 【STM32】开发板学习1 NUCLEO-L476RG:GPIO例程 点亮LED2灯
  14. 中国移动车联网 V2X 平台白皮书
  15. hpgs2wnd.exe
  16. iClap:产品经理再忙也要看《琅琊榜》
  17. 一年工作经验的java工程师从工作初到今天的所有收藏的…
  18. 【关于NI CAN USB-8473在实际应用中的案例分析】
  19. SpringBoot的学习资源 尚硅谷 蚂蚁学院
  20. 汪晓宇:如何破除中美大数据产业差距

热门文章

  1. 大数据分析的流程是怎样
  2. 垃圾分类急上头?物联网卡来消愁
  3. android左右滑动fragment,Android基于ViewPager+Fragment实现左右滑屏效果的方法
  4. 2×3卡方检验prism_卡方检验(最强总结)
  5. AcWing 829. 模拟队列
  6. jxls对比_jxls-2.x导出excel入门——基本操作
  7. linux进程自动启动,linux 嵌入式 自启动 系统自动登录-自动启动程序或脚本
  8. Spark内核解析之四:Spark 任务调度机制
  9. 决策树之ID3、C4.5、C5.0等五大算法及python实现
  10. 来自一个用户的体验-Alpha项目测试