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 层面的安全性和一致性。
相关推荐
SimonKing3 小时前
艹,维护AI写的代码,我心态崩了......
java·后端·程序员
用户298698530143 小时前
Java Word 文档样式进阶:段落与文本背景色设置完全指南
java·后端
小bo波19 小时前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
nanxun8862 天前
记一次诡异的 Docker 容器"串包"故障排查
java
用户1563068103512 天前
Day01 | Java 基础(Java SE)
java
行者全栈架构师2 天前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师2 天前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_02 天前
mac(m5)平台编译openjdk
java
唐青枫3 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马3 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端