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 层面的安全性和一致性。
相关推荐
望未来无悔5 小时前
系统学习算法 专题十八 队列+宽搜
java·算法
Linlichaoblms5 小时前
Nginx性能调优:参数详解与压测对比
java·spring boot·nginx
一个很老的小萌新5 小时前
json 解析 [{“id“:1,“name“:“apple“},{“id“:2,“name“:“banana“}]
java·前端·json
是2的10次方啊5 小时前
🏗️ 线程池深度解析:ThreadPoolExecutor底层实现与CompletableFuture异步编程实战
java
小蒜学长6 小时前
django全国小米su7的行情查询系统(代码+数据库+LW)
java·数据库·spring boot·后端
杨杨杨大侠6 小时前
第2章:设计核心接口和事件模型
java·github·eventbus
杨杨杨大侠6 小时前
第1章:事件驱动框架基础概念
java·github·eventbus
半夏陌离6 小时前
SQL 进阶指南:视图的创建与使用(视图语法 / 作用 / 权限控制)
java·数据库·mybatis
程序员皮皮林6 小时前
Java jar 如何防止被反编译?代码写的太烂,害怕被人发现
java·开发语言·jar
yh云想7 小时前
《Java线程池面试全解析:从原理到实践的高频问题汇总》
jvm·面试·职场和发展