我從來沒有專門與class literals
合作。我認爲他們主要用於反思apis。我想了解有多少實例可以用於類文字?是它們instance controlled
(例如單身?)在JVM中有多少個類文字實例可以存在?
Class<String> stringClass = String.class;
我從來沒有專門與class literals
合作。我認爲他們主要用於反思apis。我想了解有多少實例可以用於類文字?是它們instance controlled
(例如單身?)在JVM中有多少個類文字實例可以存在?
Class<String> stringClass = String.class;
被(至少在理論上)被加載的類時創建的類對象。每班只有一個。不過,將它稱爲單例是不正確的,因爲有多個Class對象,每個對象都是給定的類,就像可以有多個具有不同值的String對象一樣。
請注意,如果它們由不同的類加載器加載,則可以有兩個不同的Class對象,名爲「a.b.c」。這些將是兩個不同的類(它們甚至可能不相似)和兩個不同的Class對象。
「每個班級只有一個」不是完整的故事 - 還有古怪的'int.class','float.class',甚至是'void.class'。這些是對應於原始類型的'Class'的實例。 – 2013-02-18 18:54:32
@熱舔我有兩個疑問。 1)爲什麼你在第一行中說「理論上」? 2)你能否詳細說明你的第二段?我無法遵循它。 – Geek 2013-02-18 18:57:12
我說「理論上」,因爲實際的Class對象是一個虛擬 - 一個海量數據結構的「前端」。它可以在第一次引用時以「懶惰」的方式創建,而不是在類加載時創建。但實際上,它可能是由實際的類創建的,因爲它通常在課程加載後不久提到。至於第二部分,你可以總是有多個同名的類,但是在不同的類加載器下加載 - 查找它。 – 2013-02-18 19:07:01
Class通過Class Loader加載爲堆中的Object。
因此,每個類加載器僅存在一個類文字實例。
但是,您可以在代碼中創建許多類型類的實例。
實際上,它不是一個「類文字實例」,它是Class的一個實例,您可以使用Java源代碼中的文字符號來引用它。如果您明確要求ClassLoader提供該對象,則該對象在文字「後面」與您將獲得的Class對象相同。 – 2013-02-18 18:50:45
@hotlicks true..I試圖用一種不同的方式來表達它的意思...... :-) ....類的實例也可以表示類的實例對象... – Amit 2013-02-18 18:52:50
類在JVM啓動時通過類加載程序在堆中加載爲對象...因此,每個類加載程序只存在一個類實例實例...但是,您可以在代碼中創建許多類的類對象... – Amit 2013-02-18 18:38:43
一每個班級的「課堂」對象,足夠可預見。 – 2013-02-18 18:44:01