jvm中每個類的Class對象是唯一的嗎
在 Java 中,同一個類的 Class
對象在由同一個類加載器加載時是唯一的。析:
1. 同一類加載器的唯一性
- 規則:若一個類被同一個類加載器加載,無論創建多少實例,其
Class
對象始終唯一。 - 示例:
所有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
對象也不同。 - 示例:
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
對象。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 層面的安全性和一致性。