什么是Java中的类文字?
从Java教程 :
最后,还有一种特殊的字面types,通过types名称和附加的“
.class
”形成。 例如,String.class
。 这是指表示types本身的对象(types为Class
)。
这个文字可以分配给什么types的variables?
请尽可能举个小例子。
Class<String> c = String.class;
查看Javadoc的java.lang.Class
,看看你能用这些小家伙做些什么 – 主要与反思有关
要理解这一点,你必须明白, String是Class类的一个实例(对象)。 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 String
的instance (object)
的值是一个String literal
(例如"I am a string."
):
class | instance (object) | literal ------------------------------------------------ String | instance_name = | "I am a string."
而class Object
的instance (object)
的值是一个Class literal
– (例如Hashtable.class
),它引用class Hashtable
的instance (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