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.class 和 Integer.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 层面的安全性和一致性。
相关推荐
devilnumber3 分钟前
springboot的保护机制怎么实现的,为何能做到服务不宕机
java·spring boot·后端
未秃头的程序猿4 分钟前
一次重复扣款的复盘:分布式锁加错了维度,比不加锁更危险
java·redis·后端
估值探索者7 分钟前
【Python量化技术指标实战 02】MACD金叉也分强弱?手工算一次 DIF/DEA 就懂了
java·开发语言·python·股票数据·股票数据api接口
m0_6399069418 分钟前
MyBatis 核心体系:核心接口、动态 SQL 原理、插件底层机制
java·sql·mybatis
XiYang-DING44 分钟前
P5528.带过期时间的 LRU 缓存
java·开发语言·缓存
SimonKing1 小时前
DeepSeek 新模型免费白嫖,夯夯夯,赶紧用起来
java·后端·程序员
SabrinaW7111 小时前
基于 C++17 与 RTTR 的注册式对象工厂:配置驱动的动态对象创建
java·前端·数据库
zhangx1234_1 小时前
javaEE 多线程4
java·开发语言
中电金信2 小时前
从业务调优到分层缓存:DeepSeek V4 Flash的PPU实践
java·开发语言
snow@li2 小时前
ruoyi-vue-pro/芋道源码:一键改包名/用项目自带的 ‌ProjectReactor‌ 程序/彻底、省事
java