的Java文档Class
说:
Class
Java虚拟机在装入类时以及通过defineClass
对类装入器中的方法的调用自动构造对象。
这些Class
对象是什么?它们是否与通过调用从类实例化的对象相同new
?
另外,例如,即使我不继承,也object.getClass().getName()
如何将所有内容都转换为超类?Class
java.lang.Class
Answers:
没有任何内容被强制转换为Class
。Object
Java中的每一个都属于某个对象class
。这就是为什么Object
其他所有类都继承的类定义了getClass()
方法的原因。
getClass()
,或class-literal-Foo.class
返回一个Class
对象,其中包含有关该类的一些元数据:
和一些有用的方法等铸造和各种检查(isAbstract()
,isPrimitive()
等)。Javadoc确切显示了您可以获得有关类的哪些信息。
因此,例如,如果为您的方法提供了一个对象,并且您想对其进行处理以防使用注释进行@Processable
注释,则:
public void process(Object obj) {
if (obj.getClass().isAnnotationPresent(Processable.class)) {
// process somehow;
}
}
在此示例中,您获取有关给定对象的类的元数据(无论它是什么),并检查它是否具有给定的批注。Class
实例上的许多方法称为“反射操作”,或简称为“反射。请在此处阅读有关反射,使用原因和时间的信息。
还要注意,Class
对象表示枚举和接口以及正在运行的Java应用程序中的类,并具有各自的元数据。
总而言之,java中的每个对象都有一个(属于)一个类,并且具有各自的Class
对象,其中包含有关它的元数据,可以在运行时访问该对象。
类对象是一种描述对象类的元对象。它通常与Java的反射功能一起使用。您可以将其视为实际课程的“蓝图”。例如,您有一个像这样的汽车:
public class Car {
public String brand;
}
然后,您可以构造一个Class对象,该对象描述您的“ Car”类。
Class myCarClass = Class.forName("Car");
现在,您可以在该Class对象的Car类上进行各种查询:
myCarClass.getName() - returns "Car"
myCarClass.getDeclaredField("brand") - returns a Field object describing the "brand" field
等等。每个Java对象都有一个getClass()方法,该方法返回描述Java对象的Class的Class对象。因此,您可以执行以下操作:
Car myCar = new Car();
Class myCarClass = myCar.getClass();
这也适用于您不知道的对象,例如,从外部获得的对象:
public void tellMeWhatThisObjectsClassIs(Object obj) {
System.out.println(obj.getClass().getName());
}
您可以将此方法提供给任何Java对象,它会打印给定对象的实际类。
使用Java时,大多数时候您不需要担心Class对象。他们有一些方便的用例。例如,它们允许您以编程方式实例化某个类的对象,该类常用于对象序列化和反序列化(例如,将Java对象与XML或JSON来回转换)。
Class myCarClass = Class.forName("Car");
Car myCar = myCarClass.newInstance(); // is roughly equivalent to = new Car();
您还可以使用它来查找类等所有已声明的字段或方法,这在某些情况下非常有用。因此,例如,如果您的方法获得了一个未知对象,并且您需要了解更多有关该对象的信息,例如它是否实现了某些接口等,那么Class类就是您的朋友。
简而言之,java.lang.reflect包中的Class,Field,Method等类使您可以分析定义的类,方法,字段,创建它们的新实例,调用方法以及其他各种方法并且它们允许您在运行时动态地执行此操作。
我还想补充一下ColinD的答案,即getClass将为相同类型的实例返回相同的对象。这将打印true:
MyOtherClass foo = new MyOtherClass();
MyOtherClass bar = new MyOtherClass();
System.out.println(foo.getClass()==bar.getClass());
请注意,不是equals
,我正在使用==
。
Class对象是Class(java.lang.Class)的实例。下面引用来自类的javadoc的报价应回答您的问题
该类没有公共构造函数。取而代之的是,Java对象将在类加载时以及在类加载器中调用defineClass方法时自动构造Class对象。
为了完全理解类对象,让我们回顾一下,并首先获得类对象。您会看到,.java
创建的每个文件,在编译该.java
文件时,jvm都会创建一个.class
文件,该文件包含有关该类的所有信息,即:
您在上面看到的列表是您在典型班级中通常看到的列表。现在,到目前为止,您的.java
文件和.class
文件已存在于硬盘上,当您实际上需要使用类(即在main()
方法中执行代码)时,jvm将使用.class
硬盘中的文件并将其加载到5个内存中的一个中将.class
文件加载到方法区域后,jvm中的区域(即方法区域)将立即使用该信息和一个Class对象,该对象表示堆内存区域中存在的该类。
这是顶层视图,
.java
--compile->-> .class
->执行脚本时->.class
加载到方法区域中--jvm从方法区域创建类对象->诞生了一个类对象
使用类对象,您可以获得诸如类名和方法名之类的信息,以及有关该类的所有信息。
同样要记住,脚本中使用的每个类都应该只有一个类对象。
希望这有意义
默认情况下,Object类是Java中所有类的父类。换句话说,它是Java的顶级类。
如果要引用其类型未知的任何对象,则Object类很有用。请注意,父类引用变量可以引用子类对象,称为向上转换。
让我们举个例子,有一个getObject()方法返回一个对象,但是它可以是任何类型,例如Employee,Student等,我们可以使用Object类引用来引用该对象。例如:
Object obj=getObject()
; //我们不知道此方法将返回什么对象
Class
类继承自Object
本身。Class.class
返回Class
表示Class
该类的对象。您可以反思。我的头顶。