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 层面的安全性和一致性。
相关推荐
信誓旦旦的程序猿几秒前
【量化系统从零构建 #04】存储设计:选型·建库·交易日历
java·人工智能·python·股票数据api·股票数据·股票数据api接口·股票api数据接口
yurenpai(27届找实习中)几秒前
Java 10 的 var 为什么不能随便用?从订单汇总看懂类型推断与泛型陷阱
java·开发语言·java18
Flynt1 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端
Tangyuewei2 小时前
给老 Spring 项目装个 AI Agent
java·人工智能·spring
她的男孩2 小时前
多租户和数据权限怎么共存?扒完拦截器注册链路,我找到 4 个隐蔽的坑
java·后端·架构
小溪学编程2 小时前
Java BufferedReader 详解:从基础用法到性能优化
java·python·性能优化
HZero.chen3 小时前
Java 匿名类简介
java·匿名类
用户3126874877203 小时前
Java 泛型擦除到底擦掉了什么?类型安全与桥接方法深度拆解
java
暖焰核心3 小时前
继承全解——继承、默认成员函数、切片、隐藏与虚继承
java·前端·javascript
君顾13 小时前
外卖CPS系统开发实战指南:从架构设计到部署全流程解析
java·开发语言·外卖