什么是类加载器?

2 个回答

  • 彩鳞
    快乐出现的时候,就好好享受快乐。
    ## 类加载器分类 ### 引导类加载器(**Bootstrap ClassLoader**) 负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,这个加载器是由C++写的,所以我们在java源码里面是找不到它的实现,如果尝试对它进行打印,输出将为空值。 ### 扩展类加载器(**Extension ClassLoader**) 负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR 类包,也可以使用java.ext.dirs来指定路径,一般保持默认就好。 ### 应用程序类加载器(**Application ClassLoader**) 负责加载类路径下的jar包和class文件,我们自己写的代码都是通过这个类加载加载的 ### 自定义类加载器 我们自己去实现的类加载器,其父类加载器为应用程序类加载器。 ## 类加载器之间的关系 ![image.png](https://images.codewd.com/2142dc07d529ab7308e59503963e924b.jpg "image.png") ## 验证类加载器加载的路径 ```java package com.lglbc.day1; import sun.misc.Launcher; import java.net.URL; public class TestClassLoader { public static void main(String[] args) { System.out.println(String.class.getClassLoader()); System.out.println(com.sun.crypto.provider.DESKeyFactory.class.getClassLoader().getClass().getName()); System.out.println("===============手动分割================"); ClassLoader appClassLoader = ClassLoader.getSystemClassLoader(); ClassLoader extClassloader = appClassLoader.getParent(); ClassLoader bootstrapLoader = extClassloader.getParent(); System.out.println("the bootstrapLoader : " + bootstrapLoader); System.out.println("the extClassloader : " + extClassloader); System.out.println("the appClassLoader : " + appClassLoader); System.out.println("===============手动分割================"); System.out.println("bootstrapLoader加载以下文件:"); URL[] urls = Launcher.getBootstrapClassPath().getURLs(); for (int i = 0; i < urls.length; i++) { System.out.println(urls[i]); } System.out.println("===============手动分割================"); System.out.println("extClassloader加载以下文件:"); System.out.println(System.getProperty("java.ext.dirs")); System.out.println("===============手动分割================"); System.out.println("appClassLoader加载以下文件:"); System.out.println(System.getProperty("java.class.path")); } } ``` ![image.png](https://images.codewd.com/00248e215e8ebe1ad54b4206b18c3441.jpg "image.png") ## 类加载器初始化过程(源码解读) ```java 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); } Thread.currentThread().setContextClassLoader(this.loader); String var2 = System.getProperty("java.security.manager"); if (var2 != null) { SecurityManager var3 = null; if (!"".equals(var2) && !"default".equals(var2)) { try { var3 = (SecurityManager)this.loader.loadClass(var2).newInstance(); } catch (IllegalAccessException var5) { } catch (InstantiationException var6) { } catch (ClassNotFoundException var7) { } catch (ClassCastException var8) { } } else { var3 = new SecurityManager(); } if (var3 == null) { throw new InternalError("Could not create SecurityManager: " + var2); } System.setSecurityManager(var3); } } ```
    发布于 2024-12-18 01:02 •IP属地 陕西
    举报
    评论
    收藏

  • 小王子-B644
    时间不在乎你拥有多少,而在于你怎样使用。
    ### 什么是类加载器? 类加载器是负责将 Java 类文件加载到 JVM 中的特殊对象。Java 源代码通过 `javac` 编译器编译成字节码文件(.class 文件),然后由 JVM 解释执行。类加载器的主要功能是从文件系统、网络或其他来源加载类文件并将它们转换为 JVM 能够理解的格式。 ### 类加载器的作用 1. **加载类文件**:将类文件从文件系统、网络或其他来源加载到内存中。 2. **类缓存**:缓存已经加载的类,避免重复加载。 3. **命名空间管理**:每个类加载器都有自己的命名空间,确保类的唯一性。 4. **安全检查**:确保加载的类文件不违反 Java 安全模型。 ### 类加载器的工作过程 1. **加载(Loading)**:查找并加载类文件到内存。 2. **链接(Linking)**:包括验证、准备和解析三个步骤。 - **验证**:检查类文件的正确性和安全性。 - **准备**:为类的静态变量分配内存,并将其初始化为默认值。 - **解析**:将符号引用转换为直接引用。 3. **初始化(Initialization)**:执行类的初始化代码,为静态变量赋予正确的初始值。 ### 类加载器的类型 1. **Bootstrap ClassLoader(启动类加载器)**: - 加载核心类库,如 `java.lang.*` 等。 - 由 JVM 内部实现,使用本地代码实现。 2. **Extension ClassLoader(扩展类加载器)**: - 加载标准扩展类库(`JAVA_HOME/lib/ext` 目录下的类库)。 - 由 `sun.misc.Launcher$ExtClassLoader` 实现。 3. **System ClassLoader(系统类加载器)**: - 加载应用程序类路径(CLASSPATH)下的类。 - 由 `sun.misc.Launcher$AppClassLoader` 实现。 4. **自定义类加载器**: - 用户可以通过继承 `java.lang.ClassLoader` 类来实现自定义的类加载器,以满足特定需求。 ### 类加载器的双亲委派模型 类加载器在加载类时,首先会将请求委托给父加载器,父加载器先尝试加载该类,如果父加载器无法加载,子加载器才会尝试加载。这种机制保证了 Java 核心类库的安全性和统一性,避免核心类库被替换或篡改。 ### 类加载器的使用场景 - **模块化应用**:不同模块可以使用不同的类加载器加载,避免类冲突。 - **热部署**:支持在不重启应用的情况下更新类文件。 - **插件系统**:加载和管理不同来源的插件。 类加载器是 Java 体系结构中的一个关键组件,负责将类文件加载到 JVM 中并确保类文件的正确性和安全性。通过了解类加载器的工作原理和类型,可以更好地管理和优化 Java 应用程序的类加载过程。
    发布于 2024-07-23 15:05 •IP属地 黑龙江
    举报
    评论
    收藏