类加载有几种?ClassLoader显式加载/new隐式加载/字面量加载/访问静态字段加载

类的加载有几种?

在 Java 编程中,类的加载是 JVM(Java 虚拟机)运行时的核心机制之一。类加载的过程将类的字节码加载到内存中,并进行验证、准备、解析和初始化等步骤。以下是常见的类加载方式及其相关知识点的复盘,适合面试或技术复习。

类加载的几种方式

1. 通过 ClassLoader 显式加载

  • 描述 : 使用 ClassLoaderloadClass() 方法或 Class.forName() 方法显式加载类。

  • 特点 :

    • loadClass() 只加载类但不初始化。
    • Class.forName() 可以选择是否初始化(通过参数控制)。
  • 代码示例 :

    java 复制代码
    Class<?> clazz = Class.forName("com.example.MyClass"); // 加载并初始化
    ClassLoader.getSystemClassLoader().loadClass("com.example.MyClass"); // 仅加载
  • 应用场景: 动态加载插件或模块时常用。

2. 通过 new 关键字隐式加载

  • 描述 : 使用 new 关键字创建对象时,JVM 会自动加载对应的类。

  • 特点: 加载和初始化同时发生。

  • 代码示例 :

    java 复制代码
    MyClass obj = new MyClass();
  • 应用场景: 日常开发中最常见的方式。

3. 通过反射加载

  • 描述 : 使用 Java 反射机制(如 Class.forName()ClassLoader)加载类。

  • 特点: 灵活性高,常用于框架开发。

  • 代码示例 :

    java 复制代码
    Class<?> clazz = Class.forName("com.example.MyClass", true, this.getClass().getClassLoader());
  • 应用场景: Spring、Hibernate 等框架中常见。

4. 通过类字面量加载

  • 描述 : 使用 .class 语法获取类的 Class 对象。

  • 特点: 仅加载类,不触发初始化。

  • 代码示例 :

    java 复制代码
    Class<?> clazz = MyClass.class;
  • 应用场景: 需要获取类元信息但不实例化时使用。

5. 通过静态成员访问触发加载

  • 描述: 访问类的静态变量或静态方法时,JVM 会加载该类。

  • 特点: 加载和初始化同时发生。

  • 代码示例 :

    java 复制代码
    System.out.println(MyClass.staticField);
  • 注意 : 如果静态变量是 final 且在编译期确定,则不会触发类加载(常量池优化)。

类加载的生命周期

类加载的完整过程包括以下阶段:

  1. 加载 (Loading): 将字节码从磁盘或网络加载到内存。
  2. 验证 (Verification): 确保字节码符合 JVM 规范。
  3. 准备 (Preparation): 为静态变量分配内存并设置默认值。
  4. 解析 (Resolution): 将符号引用转换为直接引用。
  5. 初始化 (Initialization): 执行静态代码块和静态变量赋值。

常见面试问题

  1. Class.forName()ClassLoader.loadClass() 的区别?
    • Class.forName() 默认初始化类,loadClass() 不初始化。
  2. 什么情况下会触发类加载?
    • new 对象、访问静态成员、反射调用等。
  3. 双亲委派模型的作用?
    • 确保类的唯一性,避免重复加载。

总结

类加载的方式主要包括显式加载(ClassLoaderClass.forName)、隐式加载(new、静态访问)和反射加载等。理解这些方式及其背后的机制,不仅能应对面试"八股",也能在实际开发中更好地处理类加载相关问题。

相关推荐
ping某36 分钟前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
JustHappy40 分钟前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......
前端·后端·面试
uhakadotcom1 小时前
在python 的 工程化架构中 ,什么是 薄包装器层?
后端·面试·github
用户1474853079745 小时前
CodeX使用Skill生成游戏美术和音乐资源,一分钟入门
后端
Melody1235 小时前
用 abort 中断 AI 流式请求,我之前做错了
后端
onething3656 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 5 —— SSE 流式输出 + 打字机效果
人工智能·后端·全栈
一个做软件开发的牛马6 小时前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
码事漫谈6 小时前
AI 编程的「三体」架构:OpenSpec + Superpowers + GStack 如何让一个开发者撑起整个研发团队
后端
吃饱了得干活6 小时前
深入解析 OpenFeign:从重试、拦截到负载均衡的全维度实践
后端
onething3656 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 6 —— 业务完善 + 会话消息预览
人工智能·后端·全栈