2

在我的教科书中,我可以读到:

如果 T 是任何 Java 类型,T.class则为匹配的类对象。例如:

Class cl1 = Date.class; // if you import java.util.*; 
Class cl2 = int.class;
Class cl3 = Double[].class;

后来我正在阅读:

虚拟机为每种类型管理一个唯一的 Class 对象。因此,您可以使用==运算符来比较类对象。例如:

if (e.getClass() == Employee.class)

您能帮我在文档中找到有关此 .class 字段的任何信息吗?还有另一个问题 - 我不明白 是否e.getClass() == Employee.classe.class == Employee.class. 我的意思是,如果是一样的,为什么教科书的作者在getClass这里用左手表达。

4

2 回答 2

2

来自JLS §15.8.2 - 类文字

类字面量是由类、接口、数组或原始类型或伪类型 void 的名称组成的表达式,后跟一个“.”。和令牌类。
C.class 的类型是 Class,其中 C 是类、接口或数组类型的名称(第 4.3 节)。

所以, Date.class,int.class只不过是类文字,它Class为类类型提供适当的对象。

我不明白 e.getClass() == Employee.class 是否与 e.class == Employee.class 相同

不,它们不一样。事实上,e.class甚至不会编译。根据上面类文字的定义,因为e不是类型而是Employee(我假设)的对象,e.class所以不是有效的类文字。要获取类的 Class 对象,使用它的实例,您需要使用Object#getClass()方法。

因此,e.getClass()和是获取类对象的Employee.class两种不同方式。两者在不同的情况下使用。当你知道类类型时,使用第二个版本,当你有你的类的实例时,使用第一版ClassEmployee

但是,请注意,在继承的情况下,e.getClass()可能不会返回与Employee.class. 前者将返回由引用引用的实际子类对象的 Class 对象e,而后者总是给你Class<Employee>

如果您既没有实例,也没有可用的类类型,那么您还可以使用 -Class#forName(String)方法获取 String 形式的类名的 Class 对象。

于 2013-08-24T14:19:08.367 回答
2

如何获得 Class 对象取决于您已经知道的内容。如果你有一个被 x 引用的对象,你可以通过 x.getClass() 获取它的类的 Class 对象。如果您在编写代码时知道类型 T 的名称,则可以使用 T.class 来获取类对象。还有第三种方法,不太方便,只需要运行时访问类名。

getClass 方法在Object API 文档中被描述为 Object 方法之一。

Java 语言规范中描述了类文字,即 T.class 形式。

第三种方法使用为java.lang.Class的 API 文档定义的静态 forName 方法之一。

于 2013-08-24T14:21:01.283 回答