在我的教科书中,我可以阅读:
如果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
。
答案 0 :(得分:2)
来自JLS §15.8.2 - Class Literals:
类文字是一个表达式,由类,接口,数组或基本类型的名称或伪类型void组成,后跟“。”。和令牌类 C.class的类型,其中C是类,接口或数组类型(第4.3节)的名称,是Class。
因此,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
是获取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文档。