> For the complete documentation index, see [llms.txt](https://keyus-organization.gitbook.io/keyuhan.work/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://keyus-organization.gitbook.io/keyuhan.work/day3-jvm.md).

# day3: JVM

#### **Day3 学习计划详解：类加载机制与自定义类加载器实战**

以下是 **Day3** 的详细学习步骤、核心知识点和实操指南，结合书籍与工具，确保你高效完成目标。

***

**上午（3小时）：类加载机制与双亲委派模型**

**核心目标**：掌握类加载流程、双亲委派机制、自定义类加载器的实现原理。

**1. 学习内容与步骤**

1. **精读《深入理解Java虚拟机》第7章**（重点：7.2-7.4节）
   * **核心知识点**：
     * **类加载流程**：加载（Loading）→ 链接（Linking）→ 初始化（Initialization）；
     * **双亲委派模型**：
       * 类加载器层级：Bootstrap → Extension → Application → Custom；
       * 委派逻辑：子加载器先委托父加载器加载类，避免重复加载。
     * **破坏双亲委派的场景**：
       * Tomcat为每个Web应用独立加载类（隔离性需求）；
       * SPI机制（如JDBC驱动加载，使用线程上下文类加载器）。
   * **学习建议**：
     * 绘制类加载流程图（标注各阶段任务，如`ClassLoader.loadClass()`调用链）。
2. **结合OpenJDK源码验证类加载逻辑**
   * **源码定位**：
     * `ClassLoader`类源码路径：`src/java.base/share/classes/java/lang/ClassLoader.java`
     * 关键方法：`loadClass()`（双亲委派入口）、`findClass()`（自定义类加载逻辑）。
   * **实践建议**：
     * 使用IDE（如IntelliJ）跟踪`loadClass()`方法，观察委派流程。
3. **Arthas工具分析类加载**
   * **常用命令**：

     ```bash
     # 查看已加载的类  
     sc -d *YourClassName*  
     # 追踪类加载过程  
     trace java.lang.ClassLoader loadClass  
     ```
   * **实践建议**：
     * 运行一个简单Java程序，用Arthas追踪`String`类的加载过程。

**2. 学习产出**

* **知识笔记**：整理类加载流程、双亲委派模型的核心逻辑及破坏场景。
* **疑问记录**：如“如何实现热部署？”、“如何隔离不同模块的类加载”。

***

**下午（3小时）：自定义类加载器实现加密Class加载**

**核心目标**：手写自定义类加载器，加载加密的Class文件，理解类加载的灵活性。

**1. 实战步骤与代码示例**

1. **设计加密Class文件**
   * **加密方法**：使用简单的XOR加密（示例）：

     ```java
     public class ClassEncryptor {  
         // XOR加密（密钥为0xAA）  
         public static byte[] encrypt(byte[] bytes) {  
             byte[] encrypted = new byte[bytes.length];  
             for (int i = 0; i < bytes.length; i++) {  
                 encrypted[i] = (byte) (bytes[i] ^ 0xAA);  
             }  
             return encrypted;  
         }  
     }  
     ```
   * **生成加密Class文件**：
     * 编译一个测试类（如`HelloWorld.java`），生成`HelloWorld.class`；
     * 调用`ClassEncryptor.encrypt()`加密`HelloWorld.class`，保存为`HelloWorld_encrypted.class`。
2. **实现自定义类加载器**
   * **代码示例**：

     ```java
     public class CustomClassLoader extends ClassLoader {  
         private final String classPath;  

         public CustomClassLoader(String classPath) {  
             this.classPath = classPath;  
         }  

         @Override  
         protected Class<?> findClass(String name) throws ClassNotFoundException {  
             try {  
                 // 1. 读取加密的Class文件  
                 byte[] encryptedBytes = Files.readAllBytes(Paths.get(classPath + name.replace(".", "/") + "_encrypted.class"));  
                 // 2. 解密（XOR密钥0xAA）  
                 byte[] decryptedBytes = new byte[encryptedBytes.length];  
                 for (int i = 0; i < encryptedBytes.length; i++) {  
                     decryptedBytes[i] = (byte) (encryptedBytes[i] ^ 0xAA);  
                 }  
                 // 3. 定义类  
                 return defineClass(name, decryptedBytes, 0, decryptedBytes.length);  
             } catch (IOException e) {  
                 throw new ClassNotFoundException("Class not found: " + name, e);  
             }  
         }  
     }  
     ```
3. **测试与验证**
   * **测试用例**：

     ```java
     public class TestCustomLoader {  
         public static void main(String[] args) throws Exception {  
             CustomClassLoader loader = new CustomClassLoader("/path/to/encrypted/classes/");  
             Class<?> clazz = loader.loadClass("com.example.HelloWorld");  
             Object instance = clazz.getDeclaredConstructor().newInstance();  
             clazz.getMethod("sayHello").invoke(instance);  
         }  
     }  
     ```
   * **预期输出**：

     ```
     Hello World!  
     ```

**2. 交付物要求**

1. **GitHub代码**：
   * 创建仓库（如`custom-classloader`），提交以下内容：
     * `ClassEncryptor.java`（加密工具类）；
     * `CustomClassLoader.java`（自定义加载器）；
     * `HelloWorld.java`（测试类）及加密后的Class文件；
     * `TestCustomLoader.java`（测试用例）。
   * **README.md**：说明编译、加密、运行步骤。
2. **类加载时序图**：
   * **工具推荐**：PlantUML、Draw\.io；
   * **内容要求**：标注双亲委派流程、自定义加载器的`findClass()`调用链。
   * **示例图核心节点**：

     ```
     [TestCustomLoader] → [CustomClassLoader.loadClass()]  
                            ↓  
                     [委托父加载器加载] → [父加载器未找到]  
                            ↓  
                     [调用CustomClassLoader.findClass()] → [解密Class文件]  
                            ↓  
                     [defineClass()定义类] → [返回Class对象]  
     ```

***

**晚上（2小时）：总结与输出**

1. **技术博客**：
   * **标题**：《Day3：突破双亲委派——自定义类加载器与加密Class加载实战》
   * **内容框架**：
     * 类加载机制与双亲委派模型总结；
     * 自定义类加载器实现步骤与加密逻辑；
     * 应用场景（如热部署、模块隔离）。
2. **提交GitHub与文档**：
   * 推送代码至仓库，附时序图和博客链接；
   * 在本地或云笔记中归档Day3学习记录。

***

#### **资源使用建议**

1. **书籍重点章节**：
   * 《深入理解Java虚拟机》第7章（精读7.2-7.4节）；
   * 《Java核心技术卷I》第9章（类加载器与反射机制）。
2. **开源代码参考**：
   * **Tomcat类加载器**（[源码链接](https://github.com/apache/tomcat/tree/main/java/org/apache/catalina/loader)）：学习`WebappClassLoader`的实现；
   * **Java Agent热部署**（如JRebel）：研究其如何利用自定义类加载器实现热更新。

***

#### **明日预习（Day4）**

* **核心内容**：Arthas工具链（监控、诊断、热更新）；
* **工具准备**：安装Arthas，准备一个模拟OOM的Java程序（如循环创建大对象）。

**Day3完成标志**：加密Class加载成功、时序图清晰、博客发布。\
**若遇到问题**：优先查阅《深入理解Java虚拟机》第7章，或在Stack Overflow搜索“custom classloader example”。
