一种获取Class类型对象的方法

时间:2013-08-24 14:06:33

标签: java

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

如果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字段的内容。 另一个qutstion - 我无法理解 e.getClass() == Employee.class 是否与e.class == Employee.class相同。我的意思是,如果它是相同的,为什么教科书的作者在左手表达中使用了getClass

2 个答案:

答案 0 :(得分:2)

来自JLS §15.8.2 - Class Literals

  

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

因此,Date.classint.class只是类文字,它为类类型提供了适当的Class个对象。

  

我无法理解e.getClass()== Employee.class是否与e.class == Employee.class相同

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

因此,e.getClass()Employee.class是获取Class类的Employee对象的两种不同方法。两者都用于不同的情况。当你知道类类型时,使用2 nd 版本,当你有一个类的实例时,使用1 st 版本。

但请注意,在继承的情况下,e.getClass()可能不会返回与Employee.class相同的Class对象。前者将返回实际子类对象的Class对象,由引用e引用,而后者将始终为您提供Class<Employee>

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

答案 1 :(得分:2)

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

getClass方法被描述为Object API documentation中的Object方法之一。

类文字,T.class表单,在Java Language Specification

中描述

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