1. ContextClassLoader 线程上下文类加载器
线程上下文 ClassLoader 由线程创建者提供,供运行于该线程的代码加载类和资源时使用。如果未设定,则默认为父线程的 ClassLoader。
Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(ClassLoader);
原始线程的上下文 ClassLoader 通常设定为用于加载应用程序的类加载器,下面的代码片段是截至 sun.misc.Launcher 类,此类由“启动类加载器”加载
private static Launcher launcher = new Launcher();
public static Launcher getLauncher() {
return launcher;
}
public Launcher() {
//扩展类加载器
ClassLoader extcl;
try {
extcl = ExtClassLoader.getExtClassLoader();
} catch (IOException e) {
throw new InternalError(
"Could not create extension class loader");
}
//系统类加载器
try {
loader = AppClassLoader.getAppClassLoader(extcl);
} catch (IOException e) {
throw new InternalError(
"Could not create application class loader");
}
//设置原始线程的上下文ClassLoader为系统类加载器
Thread.currentThread().setContextClassLoader(loader);
...
}
2. static 静态块的初始化
static 静态块只有在使用 new 或 Class.forName(className) 时才会被初始化,并且只执行1次
Class.forName() 方法内部是通过 jni 调用本地代码实现的 Class.forName0(className, true, ClassLoader.getCallerClassLoader())
/**
* @param name 类名
* @param initialize 是否必须初始化类,如果为false初始化将在第1次实例化类时执行,只执行1次
* @param loader 用于加载类的类加载器
* @return
* @throws ClassNotFoundException
*/
private static native Class forName0(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException;
new 与 Class.forName(className) 的区别在于,使用 new 必须显示的 import 类,否则就无法编译通过。而Class.forName是在运行时查找与加载。
分享到:
相关推荐
双亲委派模型使得系统类(如java.*开头的类)由Bootstrap ClassLoader加载,而用户自定义类由应用程序类加载器(AppClassLoader)加载。这避免了类的冲突,保持了系统类库的稳定性。但有时我们可能需要打破这种模型...
Java的ClassLoader类加载器机制 在 Java 虚拟机(JVM)中,类加载器(ClassLoader)扮演着非常重要的角色。类加载器负责加载 Java 类,包括核心类和用户自定义类。在 JVM 运行过程中,类加载器会形成一个层次结构,...
2. Extension ClassLoader:扩展类加载器,负责加载`<JAVA_HOME>/lib/ext`目录下的扩展类库,或者被`-Djava.ext.dirs`指定的路径中的类。 3. Application ClassLoader:也称为系统类加载器,负责加载用户类路径`-cp...
2. **扩展类加载器(Extension ClassLoader)**:它负责加载位于`-Djava.ext.dirs`系统属性所指定目录中的jar文件。 3. **应用程序类加载器(Application ClassLoader)**:也称为系统类加载器,它负责加载用户类...
2. 类的可见性:不同的ClassLoader加载的类相互之间默认是不可见的,除非使用` ProtectionDomain`进行设置。 3. 性能:频繁的类加载会影响性能,因此应尽量减少不必要的类加载操作。 在实际应用中,我们可以通过...
扩展类加载器是一个Java类,它在运行时被Bootstrap ClassLoader加载,并且它同样会加载扩展API中的类。 3. Application ClassLoader(应用程序类加载器):也被称为System ClassLoader(系统类加载器),它负责加载...
2. **扩展类加载器(Extension ClassLoader)**:由sun.misc.Launcher$ExtClassLoader实现,加载JRE扩展目录`jre/lib/ext`下的jar文件,或者系统属性`java.ext.dirs`指定的路径。 3. **应用程序类加载器(Application ...
【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!
类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...
2. **双亲委派模型**:Java的类加载机制遵循双亲委派模型,即当一个类加载器接收到加载类的请求时,它会先委托给父类加载器去加载,只有当父类加载器无法加载时,当前类加载器才会尝试自己加载。这种设计有助于防止...
2. **Extension Class Loader(扩展类加载器)**:该类加载器由`sun.misc.Launcher$ExtClassLoader`实现,负责加载`JAVA_HOME/jre/lib/ext`目录中的所有类库。Extension Class Loader的父加载器为Bootstrap Class ...
Java中ClassLoader类加载学习总结 ClassLoader类加载是Java语言的一种创新,目的是为了将类的加载过程与虚拟机解耦,达到”通过类的全限定名来获取描述此类的二进制字节流“的目的。类加载器的基本模型就是双亲委派...
2. **扩展类加载器(Extension ClassLoader)** - **实现类**:`sun.misc.Launcher$ExtClassLoader` - **作用**:加载`java.ext.dirs`系统属性所指定目录下的所有类库,默认为`%JAVA_HOME%\jre\lib\ext`目录。 - ...
2. Webapp ClassLoader:每个Web应用程序都有自己的Webapp ClassLoader,用于加载WEB-INF/classes和WEB-INF/lib下的类,遵循"父子优先"原则,优先尝试从父类加载器加载,如果找不到再从自身加载。 3. Shared ...
Java ClassLoader是一个核心的Java运行时组件,负责加载类到Java虚拟机(JVM)中。它是Java平台的独特特性,因为它允许动态加载类,增强了软件的可扩展性和灵活性。这篇博文(虽然链接不可用)可能深入探讨了...
ClassLoader 是 Java 中的一个抽象类,它的主要作用是加载 Class 文件到 JVM 中。ClassLoader 使用了双亲委托模式进行类加载,每一个自定义的 ClassLoader 都必须继承 ClassLoader 这个抽象类,而每个 ClassLoader ...
类加载器(`ClassLoader`)负责将编译后的`.class`文件加载到Java虚拟机(JVM)中执行,而类路径(`ClassPath`)则是指明了这些`.class`文件的位置。本文主要围绕Java类加载器和类路径展开讨论,以加深对Java运行时...
例如,`MemoryClassLoader.java`可能就是一个自定义类加载器的实现,它可以在内存中动态加载或更新类。 **JarinJAR**是一种打包技术,它可以将多个JAR文件打包成一个大的JAR文件。在热加载场景下,JarinJAR使得在...
2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。 3. 自定义URLClassLoader。检查实现类.class文件的修改时间,如果是更新的.class文件则重新加载该实现类的class。 4. 调用方法前,先获取最新的代理类,...