2 回答

TA貢獻2065條經驗 獲得超14個贊
首先,泛型部分Class<?>
在這里真的無關緊要。當然,沒有原始類型,因此Class<?>
比 Class 更好,但是對于您的問題,通配符無關緊要。
所以本質上,您是在問 Class 對象是否不可變。出于所有實際目的,它們確實如此。
當類加載器加載一個類時,類對象就存在了,除非整個類加載器被卸載,并且所有的東西都被它加載,否則它們會一直存在。
當這樣的類對象仍在某處的地圖中使用時,這不會發生。
另一方面:Class.forName()
對于已經加載的類不應該太昂貴。當諸如序列化之類的事情發揮作用時,人們建議使用 String 而不是 Class 對象,例如(參見此處)。
必須區分類對象的不可變標識和屬于該類的實際“代碼”。該代碼可以在運行時更改(通過檢測,想想代碼的熱交換)。但是類名及其每個代碼以及equals()
相等性不應受此影響。因為“身份”保持不變。
最后一點:正如下面有趣的評論所示,有一些方法可以在一定程度上改變Class 對象。但所有這些活動都絕對是“不正常的”。因此:理論上,您可能更喜歡字符串而不是 Class 對象,但實際上,在“普通”應用程序中,使用 Class 也應該可以正常工作。

TA貢獻1821條經驗 獲得超5個贊
因為我不太同意其他答案,所以我決定寫這個,
類不是一成不變的,但它們是唯一的 - 一個類只能存在一個 Class 對象的實例。
但是類不是由其名稱定義的,因為類可能來自不同的類加載器,并且不同的類加載器可能具有相同名稱的類 - 但那將是不同的類,ClassCastException
如果您在由 2 處理的代碼之間傳遞一些對象,您會得到如果該對象類型存在于它們中(作為單獨的一個,而不是繼承的),則不同的類加載器。
類實例仍然可以安全地在 中使用Set
,因為它們使用 hashset/equals 的默認實現,因此只有相同的實例Class
才會被視為相等。
但是要決定是否應該使用String
或者Class
您需要知道您的應用程序應該如何工作,就像我說的那樣,不同的類加載器之間可以存在多個具有相同名稱的類。
并且通過僅存儲類名,您不能確定Class.forName
會返回與預期相同的實例,它甚至可能從當前類加載器加載一些具有相同名稱的其他類,而不是使用預期的類。
添加回答
舉報