`
linliuwei
  • 浏览: 33174 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java Classloader 类加载篇(2)

阅读更多
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是在运行时查找与加载。
0
1
分享到:
评论

相关推荐

    ClassLoader类加载机制和原理详解

    双亲委派模型使得系统类(如java.*开头的类)由Bootstrap ClassLoader加载,而用户自定义类由应用程序类加载器(AppClassLoader)加载。这避免了类的冲突,保持了系统类库的稳定性。但有时我们可能需要打破这种模型...

    java的ClassLoader类加载器机制

    Java的ClassLoader类加载器机制 在 Java 虚拟机(JVM)中,类加载器(ClassLoader)扮演着非常重要的角色。类加载器负责加载 Java 类,包括核心类和用户自定义类。在 JVM 运行过程中,类加载器会形成一个层次结构,...

    ClassLoader类加载器

    2. Extension ClassLoader:扩展类加载器,负责加载`<JAVA_HOME>/lib/ext`目录下的扩展类库,或者被`-Djava.ext.dirs`指定的路径中的类。 3. Application ClassLoader:也称为系统类加载器,负责加载用户类路径`-cp...

    JAVA ClassLoader 讲解 (类加载器)

    2. **扩展类加载器(Extension ClassLoader)**:它负责加载位于`-Djava.ext.dirs`系统属性所指定目录中的jar文件。 3. **应用程序类加载器(Application ClassLoader)**:也称为系统类加载器,它负责加载用户类...

    Java ClassLoader定制实例

    2. 类的可见性:不同的ClassLoader加载的类相互之间默认是不可见的,除非使用` ProtectionDomain`进行设置。 3. 性能:频繁的类加载会影响性能,因此应尽量减少不必要的类加载操作。 在实际应用中,我们可以通过...

    classloader类加载器_基于java类的加载方式详解

    扩展类加载器是一个Java类,它在运行时被Bootstrap ClassLoader加载,并且它同样会加载扩展API中的类。 3. Application ClassLoader(应用程序类加载器):也被称为System ClassLoader(系统类加载器),它负责加载...

    java应用程序类加载器,ClassLoader for java Application

    2. **扩展类加载器(Extension ClassLoader)**:由sun.misc.Launcher$ExtClassLoader实现,加载JRE扩展目录`jre/lib/ext`下的jar文件,或者系统属性`java.ext.dirs`指定的路径。 3. **应用程序类加载器(Application ...

    【图解版】深入分析ClassLoader类加载工作机制

    【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!

    ClassLoader类加载机制

    类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...

    使用classloader动态加载Class

    2. **双亲委派模型**:Java的类加载机制遵循双亲委派模型,即当一个类加载器接收到加载类的请求时,它会先委托给父类加载器去加载,只有当父类加载器无法加载时,当前类加载器才会尝试自己加载。这种设计有助于防止...

    java自定义类加载classloader文档,包括代码

    2. **Extension Class Loader(扩展类加载器)**:该类加载器由`sun.misc.Launcher$ExtClassLoader`实现,负责加载`JAVA_HOME/jre/lib/ext`目录中的所有类库。Extension Class Loader的父加载器为Bootstrap Class ...

    Java中ClassLoader类加载学习总结

    Java中ClassLoader类加载学习总结 ClassLoader类加载是Java语言的一种创新,目的是为了将类的加载过程与虚拟机解耦,达到”通过类的全限定名来获取描述此类的二进制字节流“的目的。类加载器的基本模型就是双亲委派...

    java类加载器

    2. **扩展类加载器(Extension ClassLoader)** - **实现类**:`sun.misc.Launcher$ExtClassLoader` - **作用**:加载`java.ext.dirs`系统属性所指定目录下的所有类库,默认为`%JAVA_HOME%\jre\lib\ext`目录。 - ...

    java类加载器-tomcat中的类加载器

    2. Webapp ClassLoader:每个Web应用程序都有自己的Webapp ClassLoader,用于加载WEB-INF/classes和WEB-INF/lib下的类,遵循"父子优先"原则,优先尝试从父类加载器加载,如果找不到再从自身加载。 3. Shared ...

    java classloader

    Java ClassLoader是一个核心的Java运行时组件,负责加载类到Java虚拟机(JVM)中。它是Java平台的独特特性,因为它允许动态加载类,增强了软件的可扩展性和灵活性。这篇博文(虽然链接不可用)可能深入探讨了...

    Java ClassLoader学习总结

    ClassLoader 是 Java 中的一个抽象类,它的主要作用是加载 Class 文件到 JVM 中。ClassLoader 使用了双亲委托模式进行类加载,每一个自定义的 ClassLoader 都必须继承 ClassLoader 这个抽象类,而每个 ClassLoader ...

    java classloader classpath 张孝祥

    类加载器(`ClassLoader`)负责将编译后的`.class`文件加载到Java虚拟机(JVM)中执行,而类路径(`ClassPath`)则是指明了这些`.class`文件的位置。本文主要围绕Java类加载器和类路径展开讨论,以加深对Java运行时...

    springboot+java类热加载

    例如,`MemoryClassLoader.java`可能就是一个自定义类加载器的实现,它可以在内存中动态加载或更新类。 **JarinJAR**是一种打包技术,它可以将多个JAR文件打包成一个大的JAR文件。在热加载场景下,JarinJAR使得在...

    Java实现热加载完整代码;Java动态加载class;Java覆盖已加载的class;Java自定义classloader

    2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。 3. 自定义URLClassLoader。检查实现类.class文件的修改时间,如果是更新的.class文件则重新加载该实现类的class。 4. 调用方法前,先获取最新的代理类,...

Global site tag (gtag.js) - Google Analytics