jvm中每个类的Class对象是唯一的吗

jvm中每个类的Class对象是唯一的吗

在 Java 中,同一个类的 Class 对象在由同一个类加载器加载时是唯一的。析:


1. 同一类加载器的唯一性

  • 规则 :若一个类被同一个类加载器加载,无论创建多少实例,其 Class 对象始终唯一。

  • 示例

    java 复制代码
    String s1 = "hello";
    String s2 = new String("hello");
    System.out.println(s1.getClass() == s2.getClass()); // true
    System.out.println(String.class == s1.getClass());  // true

    所有 String 实例的 getClass() 返回同一个 Class 对象。


2. 不同类加载器的差异

  • 规则 :若不同类加载器加载同一个类,即使类名相同,其 Class 对象也不同。

  • 示例

    java 复制代码
    ClassLoader cl1 = new CustomClassLoader();
    ClassLoader cl2 = new AnotherClassLoader();
    Class<?> c1 = cl1.loadClass("com.example.MyClass");
    Class<?> c2 = cl2.loadClass("com.example.MyClass");
    System.out.println(c1 == c2); // false(不同类加载器导致)

3. 基本类型与数组的特殊性

  • 基本类型 :如 int.classInteger.TYPE 是同一个对象。

  • 数组类型 :每个维度和元素类型组合对应唯一的 Class 对象。

    java 复制代码
    int[] arr1 = {1, 2};
    int[] arr2 = {3, 4};
    System.out.println(arr1.getClass() == arr2.getClass()); // true
    System.out.println(arr1.getClass() == int[].class);     // true

4. 实际应用场景

  • 反射 :通过 Class.forName() 获取类时,需指定类加载器。
  • 序列化/反序列化ObjectInputStream 检查类的 Class 对象是否匹配。
  • 安全控制SecurityManager 通过 Class 对象控制类加载权限。

总结

  • 唯一性条件 :同一类 + 同一类加载器 → 唯一 Class 对象。
  • 设计意图:确保类型系统在 JVM 层面的安全性和一致性。
相关推荐
之歆2 分钟前
Spring AI入门到实战到原理源码-多模型协作智能客服系统
java·人工智能·spring
yyy(十一月限定版)16 分钟前
c++(3)类和对象(中)
java·开发语言·c++
IT 行者29 分钟前
Spring Security 7 OAuth2 Token 格式选择浅析
java·后端·spring
xxxmine32 分钟前
JVM 双亲委派模型
jvm
shughui33 分钟前
最新版IntelliJ IDEA下载+安装+汉化(详细图文)
java·ide·intellij-idea
代码or搬砖33 分钟前
JVM 类加载机制
jvm
小罗和阿泽36 分钟前
java 【多线程基础 三】
java·开发语言
我尽力学37 分钟前
JVM类加载子系统、类加载机制
jvm
想你依然心痛37 分钟前
从x86到ARM的HPC之旅:鲲鹏开发工具链(编译器+数学库+MPI)上手与实战
java·开发语言·arm开发·鲲鹏·昇腾