java引导类加载器_Java类加载器层次结构(一)
类加载器有一种父/子关系。除了引导类加载器外,每个类加载器都有一个父类加载器。本章通过分析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类加载器层次结构(一)相关推荐
- java 类加载器_Java 类加载器
一.概述 类加载器通过一个类的全限定名来获取描述此类的二进制字节流. 类加载器在类层次划分.OSGi.热部署.代码加密等领域发挥着重要的作用. 比较两个类是否"相等",只有在这两个 ...
- java classloader详解_Java类加载器(ClassLoader)详解
本文主要讲述Java ClassLoader的工作原理,这为后面将Android App代码热替换或者插件化升级做铺垫 一. 类加载器 ClassLoader即常说的类加载器,其功能是用于从Class ...
- java class加载_Java 类加载
从一个诡异的问题说起 测试案例一: packageecut.classloader;public classSun {protected static int a = 100;protected st ...
- java 装饰器_JAVA装饰器模式
Java程序员们应该对java.io对不会陌生,因为java.io包采用了装饰器模式. 一.定义: Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样 ...
- java类加载器_JAVA类加载器
虚拟机设计团队把加载动作放到 JVM 外部实现,以便让应用程序决定如何获取所需的类,JVM 提 供了 3 种类加载器: 1. 启动类加载器(Bootstrap ClassLoader) 负责加载 JA ...
- java log4j 热部署_JAVA类加载器分析--热部署的缺陷(有代码示例,及分析)
首先纠正一个误区: 热部署不是我们在Eclipse里面修改了代码不用重启就可以持续调试. 详情可以参考上一篇博文: 热部署和"Hot Code Replace"的区别 htt ...
- java 媒体播放器_Java多媒体播放器(三)
No.3 vlcj 一.简介 The vlcj project first gives you Java bindings to just about all of the native functi ...
- java类加载 复制_Java 类加载全过程
类加载的机制可以分为如下几步: 1.加载:将class字节文件码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法 ...
- java 文件分割器_Java分割器
java 文件分割器 Java Spliterator is one of the four iterators – Enumeration, Iterator, ListIterator and S ...
最新文章
- pku1384---Piggy-Bank(动态规划)
- Android开发之异步任务加载网络图片并存储在sdcard中(源代码分享)
- redirect_uri参数错误解决方法
- 计算机网络总线型结构优,计算机基础知识:计算机网络总线型拓扑结构的概述及优缺点...
- P4144 大河的序列
- labelImg重新开启工具箱(栏)
- linux挂载硬盘_Linux把内存挂载成硬盘提高读写速度-内存虚拟盘
- MATLAB数值计算笔记
- MSI Afterburner 官网链接指南
- Java实现多张图片转pdf
- 国家科技管理信息系统构建及其对科技情报工作的影响
- Webpack打包警告: We noticed you're using the `useBuiltIns` option without declaring a core-js version.
- 【STM32】开发板学习1 NUCLEO-L476RG:GPIO例程 点亮LED2灯
- 中国移动车联网 V2X 平台白皮书
- hpgs2wnd.exe
- iClap:产品经理再忙也要看《琅琊榜》
- 一年工作经验的java工程师从工作初到今天的所有收藏的…
- 【关于NI CAN USB-8473在实际应用中的案例分析】
- SpringBoot的学习资源 尚硅谷 蚂蚁学院
- 汪晓宇:如何破除中美大数据产业差距
热门文章
- 大数据分析的流程是怎样
- 垃圾分类急上头?物联网卡来消愁
- android左右滑动fragment,Android基于ViewPager+Fragment实现左右滑屏效果的方法
- 2×3卡方检验prism_卡方检验(最强总结)
- AcWing 829. 模拟队列
- jxls对比_jxls-2.x导出excel入门——基本操作
- linux进程自动启动,linux 嵌入式 自启动 系统自动登录-自动启动程序或脚本
- Spark内核解析之四:Spark 任务调度机制
- 决策树之ID3、C4.5、C5.0等五大算法及python实现
- 来自一个用户的体验-Alpha项目测试