java类加载器-Bootstrap、 ExtClassLoader、 AppClassLoader的关系
1. 简单介绍
Bootstrap、 ExtClassLoader、 AppClassLoader是java最根正苗红的
类加载器。Bootstrap是本地代码编写的(例如C), ExtClassLoader、 AppClassLoader是java代码,且都在rt.jar中,且很巧的都是sun.misc.Launcher内部类(不过这个不是重点)。
Bootstrap是爷爷、ExtClassLoader是爸爸、AppClassLoader是孩子(孙子)。但由于爸爸ExtClassLoader太忙了,所以照顾孩子AppClassLoader的责任就有爷爷Bootstrap来处理了(即,虽然ExtClassLoader是AppClassLoader老爸,但却是由爷爷Bootstrap加载的AppClassLoader。该情况与中国国情完全一样)。
2. 代码实验
Java代码 ![]()
public class LoaderTest {
/**
* @param args
*/
public static void main(String[] args) {
new LoaderTest().test();
}
/**
* @param args
*/
public void test() {
ClassLoader fatherLoader = this.getClass().getClassLoader();
System.out.println("当前类的父加载器名称:" + fatherLoader.getClass().getName());
// 这是因为AppClassLoader的父加载器虽然是ExtClassLoader,但是却是Bootstrap
// 加载的(所以它的.getClassLoader()返回为null)
// Bootstrap、 ExtClassLoader、 AppClassLoader的关系很符合中国过去,可以这么描述:ExtClassLoader是AppClassLoader的爸爸,但是AppClassLoader确实他爷爷Bootstrap一把屎一把尿喂大的。
System.out.println("AppClassLoader的直接加载器是null吗:"
+ (fatherLoader.getClass().getClassLoader() == null));
ClassLoader grandfatherLoader = fatherLoader.getParent();
System.out.println("爷爷载器名称:" + grandfatherLoader.getClass().getName());
}
}
代码运行结果:
当前类的父加载器名称:sun.misc.Launcher$AppClassLoader
AppClassLoader的加载器是null吗:true
爷爷载器名称:sun.misc.Launcher$ExtClassLoader
3. 类加载器各自搜索的目录
1.Bootstrap Loader(启动类加载器):加载System.getProperty("sun.boot.class.path")所指定的路径或jar。通过System.out.println(System.getProperty("sun.boot.class.path"));打印,发现主要是“D:\Program Files\Java\jdk1.6.0_10\jre\lib”中的jar包。
2.Extended Loader(标准扩展类加载器ExtClassLoader):加载System.getProperty("java.ext.dirs")所指定的路径或jar。在使用Java运行程序时,也可以指定其搜索路径,例如:java -Djava.ext.dirs=d:\projects\testproj\classes HelloWorld。
通过打印System.out.println(System.getProperty("java.ext.dirs"));,可以发现主要加载目录为:
“D:\Program Files\Java\jdk1.6.0_10\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext”
3、AppClass Loader(系统类加载器AppClassLoader):加载System.getProperty("java.class.path")所指定的路径或jar。在使用Java运行程序时,也可以加上-cp来覆盖原有的Classpath设置,例如: java -cp ./lavasoft/classes HelloWorld
对于eclipse,就是“.classpath”中的jar包。
ExtClassLoader和AppClassLoader在JVM启动后,会在JVM中保存一份,并且在程序运行中无法改变其搜索路径。如果想在运行时从其他搜索路径加载类,就要产生新的类加载器。
PS:这一段摘自lavasoft,地址见下。
参考:
http://hi.baidu.com/haifengjava/blog/item/498fd8365ef5c8390a55a9db.html
java类加载器-Bootstrap、 ExtClassLoader、 AppClassLoader的关系的更多相关文章
- java类加载器 Bootstrap、ExtClassLoader、AppClassLoader的关系
1.Bootstrap. ExtClassLoader. AppClassLoader是java最根正苗红的类加载器.2.Bootstrap是本地代码编写的(例如C), ExtClassLoader. ...
- java笔记--理解java类加载器以及ClassLoader类
类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制 ...
- 深入探讨 Java 类加载器
转自:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类加载器(class loader)是 Java™中的一个很重要的概念.类 ...
- 转载:深入探讨 Java 类加载器
转载地址 : http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 深入探讨 Java 类加载器 类加载器(class loader) ...
- 【转】深入探讨 Java 类加载器
转自:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html 类加载器是 Java 语言的一个创新,也是 Java ...
- 深入理解Java类加载器(1):Java类加载原理解析
1 基本信息 每个开发人员对Java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载.Java的类加载机制是技术体系中比较核心的 ...
- 深入探讨java类加载器
概览 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1.0 就出现了,最初是为了满足 ...
- 深入探讨 Java 类加载器(转)
原帖地址:https://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要 ...
- 转载 深入理解java类加载器
1 基本信息 每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载.Java的类加载机制是技术体系中比较核心的 ...
随机推荐
- Python基础(八) 模块的引入与定义
模块定义 什么是模块:一个py文件就是一个模块 模块分为三类: 内置模块,(标准库):.python解释器自带的,time,os,sys,等等.200多种. 自定义模块:自己写的模块 第三方库(模块) ...
- 交叉编译多平台 FFmpeg 库并提取视频帧
原文地址: 交叉编译多平台 FFmpeg 库并提取视频帧 交叉编译多平台 FFmpeg 库并提取视频帧 本文档适用于 x86 平台编译 armeabi.armeabi-v7a.arm64-v8a.x8 ...
- 彻底弄懂UTF-8、Unicode、宽字符、locale
目录 Unicode.UCS UTF8 宽字符类型wchar_t locale 为什么需要宽字符类型 多字节字符串和宽字符串相互转换 最近使用到了wchar_t类型,所以准备详细探究下,没想到水还挺深 ...
- HDU 1007:Quoit Design(分治求最近点对)
http://acm.hdu.edu.cn/showproblem.php?pid=1007 题意:平面上有n个点,问最近的两个点之间的距离的一半是多少. 思路:用分治做.把整体分为左右两个部分,那么 ...
- 【深入浅出-JVM】(4):编译 jdk
环境 mac,xcode,jdk8,openjdk,autoconf 步骤 安装autoconf brew install autoconf 下载openjdk源码 git clone https:/ ...
- WebRTC:数据传输相关协议简介
对网络协议来说,需要做的通常就两件事情:1.建立连接,2.传输数据,WebRTC也不例外. 假设WebRTC应用的两端已经建立了连接,那么,剩下就是如何传输数据的问题了. WebRTC同时支持传输音视 ...
- MMM 状压dp学习记
状压dp学习记 by scmmm 开始日期 2019/7/17 前言 状压dp感觉很好理解(本质接近于爆搜但是又有广搜的感觉),综合了dp的高效性(至少比dfs,bfs优),又能解决普通dp难搞定的问 ...
- Windows OS添加USB3.0驱动!
原因:现在的win7.win2008等一些早期的系统在安装时无法使USB鼠标和键盘... 1. 素材(dism64工具.UltraISO工具.U盘一个) 2. 先使用UltrISO工具制作一个wi ...
- pycharm install python packaging tools时遇到AttributeError: '_NamespacePath' object has no attribute 'sort'错误
pycharm install python packaging tools时报错AttributeError: '_NamespacePath' object has no attribute 's ...
- TF项目实战(SSD目标检测)-VOC2007
TF项目实战(SSD目标检测)-VOC2007 训练好的模型和代码会公布在网上: 步骤: 1.代码地址:https://github.com/balancap/SSD-Tensorflow 2.解压s ...