jvm中每个类的Class对象是唯一的吗
在 Java 中,同一个类的 Class
对象在由同一个类加载器加载时是唯一的。析:
1. 同一类加载器的唯一性
-
规则 :若一个类被同一个类加载器加载,无论创建多少实例,其
Class
对象始终唯一。 -
示例 :
javaString 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
对象也不同。 -
示例 :
javaClassLoader 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
对象。javaint[] 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 层面的安全性和一致性。