什么是Java中的类文字?

从Java教程 :

最后,还有一种特殊的字面types,通过types名称和附加的“ .class ”形成。 例如, String.class 。 这是指表示types本身的对象(types为Class )。

这个文字可以分配给什么types的variables?

请尽可能举个小例子。

 Class<String> c = String.class; 

查看Javadoc的java.lang.Class ,看看你能用这些小家伙做些什么 – 主要与反思有关

要理解这一点,你必须明白, StringClass类的一个实例(对象)。 string文字(例如“我是一个string”)是表示类String的实例(对象)的符号,而类文字(例如Hashtable.class)是表示类Class的实例的符号。

感谢这里的其他很好的答案,你知道它是什么,但是这里有一个典型的使用例子,可以澄清:

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

正如代码所示,这是我们初始化一个日志框架的一个线路(在这个例子中,我使用的是org.apache.log4j包,但是原理扩展到其他框架)。 getLogger()方法需要一个类文字,以便它知道它正在logging什么(即当前对象的类)。

根据JLS

15.8.2类文字

类文字是一个expression式,由一个类,接口,数组或者基本types的名字组成,后跟一个. 和令牌class 。 类文字的types是Class 。 它根据当前实例的类的定义类加载器的定义,对指定types(或void )的Class对象进行求值。

一些常见的用法可以在Class Literals中find, 如Runtime-Type Tokens

文字本身就是MyClass 。 如果你写了MyClass.class你会得到一个对类对象的引用。 如果您编写new MyClass() ,它将使用文字来获取MyClass.class获得的类对象的实例。 从实例中,通过调用myClassInstance.getClass()获得相同的类对象。

我不是100%确定,但文字本身不能被分配给任何variables。 你可以做的是获取类的string的名称,并使用reflection框架来创build一个实例。

在例子中是这样的:

 Class myClass = MyClass.class 

要么

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

要理解这一点,你必须明白String是它的superclass (parent class) Object一个instance (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. 

当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