2010-01-29 80 views
41

Java tutorial什麼是Java中的類文字?

最後,還有一個特殊的文字稱爲類文字,通過採取類型名稱並追加「.class」形成的;例如,String.class。這是指表示類型本身的對象(類型爲Class)。

要將此文字分配給哪種類型的變量?

請給一個小例子,如果可能的話。

回答

2

在示例中它是成才這樣的:

Class myClass = MyClass.class 

MyClass.class.getResourceAsStream("config.properties"); 
28

要了解這一點,你必須明白,字符串是類的實例(對象)。字符串文字(例如「我是字符串」)是表示類字符串的實例(對象)的符號,而類文字(例如Hashtable.class)是表示類的實例的符號類別

+1

很好的解釋。 – 2013-07-18 10:53:02

+0

@shinkou String是Class類的一個實例(對象)。怎麼來的?它應該是「String.class是Class類的一個實例(對象)」吧? – Ani 2015-08-04 20:16:17

+0

@Ani字符串本身也是被分配類類型字符串String.class的類Class的一個實例。想想'String str =「我是一個字符串」;',其中'str'被分配了一個字符串字面值「我是一個字符串」。 – shinkou 2015-11-16 17:15:45

19

感謝這裏的另一個很好的答案,你知道它是什麼,但這裏可能還澄清一個典型的使用例子:由於代碼表明

private static Logger log = Logger.getLogger(YourClassHere.class); 

,這是我們正在初始化,其中一條線一個日誌框架(在這個例子中,我使用的是org.apache.log4j包,但原理擴展到其他框架)。 getLogger()方法需要一個類文字,以便它知道它正在記錄什麼(即當前對象的類)。

+2

這比引用JavaDocs或其他一些定義大約多1000倍。謝謝! – Pureferret 2012-09-14 10:21:54

3

字面本身是MyClass。如果你寫MyClass.class,你會得到一個對類對象的引用。如果你寫new MyClass(),它使用文字來獲得你在MyClass.class得到的類對象的一個​​實例。從實例中,通過調用myClassInstance.getClass()獲得相同的類對象。

我不是100%確定,但文字本身不能分配給任何變量。你可以做的是獲得類的名字作爲字符串,並使用反射框架來創建一個實例。

+0

當然可以。否則,您將無法將其作爲參數傳遞給函數。文字的類型是類可以分配給該類型的引用。 – jbruni 2015-02-26 18:01:09

+0

字面本身不是類名。根據https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.8.2,類文字是標記'class'。從JLS開始:「類文字是由類,接口,數組或原始類型的名稱組成的表達式,或者是僞類型void,後跟'。'。和令牌類「。請注意,它不是該類的名稱,而是名稱後跟「.class」。 – 2016-12-01 22:38:35

10

根據the JLS

15.8.2類字面

類文字是由類,接口,數組名的表達,或後跟一個.和令牌基本類型class。類文字的類型是Class。它根據當前實例類的定義類加載器的定義,對指定類型(或void)的Class對象進行求值。

1

要了解這一點,您必須明白String是其superclass (parent class)Objectinstance (object)

class Stringinstance (object)的值是一個String literal(例如"I am a string."):

class | instance (object) | literal 
------------------------------------------------ 
String | instance_name = | "I am a string." 

class Objectinstance (object)的值是一個Class literal - (例如Hashtable.class),其指的是class Hashtableinstance (object)

class  | instance (object) | literal 
------------------------------------------------ 
Hashtable | instance_name  | Hashtable. 
+0

'String'不是任何事物的實例,當然也不是任何超類。 – 2016-12-01 22:40:05

0

當JVM加載應用程序類時,它將它們存儲在java.class.Class對象。所以,在內存中通常有幾個類型爲Class的實例代表你的類。所以你可以這樣做:

Class<Bicycle> bicycleClass = Bicycle.class; // returns the object storing your Bicycle class 
bicycleClass.getName(); // returns your class name 
bicycleClass.getDeclaredMethods(); // returns your (declared) class methods