Java基础之ClassLoader类加载器简介
2023-09-14 09:00:08 时间
classloader简介
1 classloader层次结构(父子关系)
Bootstrap(ClassLoader)
- ExtClassLoader
- AppClassLoader
- XXXClassLoader
- AppClassLoader
详见代码如下:
sun.misc.Launcher
public Launcher() {
Launcher.ExtClassLoader var1;
try {
var1 = Launcher.ExtClassLoader.getExtClassLoader();
} catch (IOException var10) {
throw new InternalError("Could not create extension class loader", var10);
}
try {
this.loader = Launcher.AppClassLoader.getAppClassLoader(var1);
} catch (IOException var9) {
throw new InternalError("Could not create application class loader", var9);
}
2 classloader加载类过程
classloader在加载class时优先尝试通过parent classloader加载,如果加载不到,才尝试自己加载,即常说的“双亲委派”,
并且如果一个class依赖其他class,比如ClassA依赖ClassB,ClassB默认由ClassA的classloader来加载。
* <p> The methods and constructors of objects created by a class loader may
* reference other classes. To determine the class(es) referred to, the Java
* virtual machine invokes the {@link #loadClass <tt>loadClass</tt>} method of
* the class loader that originally created the class.
详见代码如下:
java.lang.ClassLoader
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) {
c = parent.loadClass(name, false);
} else {
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;
}
}
相关文章
- 写给Java开发看的 Docker 干货(零基础部署Nginx MySQL SpringBoot)
- java list去重_JAVA基础-List去重的6种方式[通俗易懂]
- excel宏 java,Microsoft Excel宏运行Java程序
- Java 解决中文乱码问题
- think in java一_Think in Java(一):Java基础「建议收藏」
- java中什么是继承,和继承的接口的关系?
- java中random方法取值范围_Java Random.nextInt()方法,随机产生某个范围内的整数
- 【说站】java类变量是什么?
- 大数据必学Java基础(五十九):Map接口源码部分
- Java tps_Java static
- resttemplate post请求发送body_java发送post请求
- vscode配置java环境变量_配置Java
- Java安全基础(二)Servlet核心技术
- 大数据必学Java基础(八十八):通过案例和概念体会反射的好处
- Java基础学习笔记十三 常用API之正则表达式、Date、DateFormat、Calendar详解编程语言
- Java获取几天后的日期详解编程语言
- java基础之泛型详解编程语言
- JAVA高级工程师课程笔记整理——(二)JAVA基础详解编程语言
- 系统命令Java实现Linux系统命令调用的探究(java调用linux)
- 清除Java实现Redis数据过期自动清理(redisjava过期)
- 环境的基础Linux:Java环境的支撑者(linux是java)
- 失效Redis与Java实现过期数据失效(redisjava过期)
- Java开发者如何快速掌握Neo4j(java操作neo4j)
- Linux下Java命令的使用方法简介(linux下java命令)
- Linux下Java命令:简介与基本用法(linux下java命令)
- Java解答Oracle使用更轻松的实现方式(oracle写成java)
- 如何在Linux系统中安装Java(linux中安装java)
- Java革命Oracle旗下的程序设计利器(java简介oracle)
- Java与Oracle同步一种新的数据库模式(java同步oracle)
- java操作mongodb基础(查询排序输出list)
- Java基础之java处理ip的工具类