什么是 Class 对象 (java.lang.Class)?

2022-08-31 11:21:45

的Java文档说:

Class对象由 Java 虚拟机在装入类时自动构造,并通过调用类装入器中的方法自动构造。defineClass

这些对象是什么?它们是否与通过调用从类实例化的对象相同?Classnew

另外,例如,即使我没有继承,如何将所有内容都类型转换为超类?object.getClass().getName()Classjava.lang.Class


答案 1

没有任何内容被类型转换为 。Java中的每一个都属于某个.这就是由所有其他类继承的类定义方法的原因。ClassObjectclassObjectgetClass()

getClass()或类文字 - 返回一个对象,其中包含有关该类的一些元数据:Foo.classClass

  • 名字
  • 方法
  • 领域
  • 构造 函数
  • 附注

和一些有用的方法,如铸造和各种检查(,等)。javadoc 准确地显示了您可以获得的有关类的信息。isAbstract()isPrimitive()

因此,例如,如果为你的一个方法指定了一个对象,并且您希望在用注释注释它的情况下对其进行处理,那么:@Processable

public void process(Object obj) {
    if (obj.getClass().isAnnotationPresent(Processable.class)) {
       // process somehow; 
    }
}

在此示例中,您将获取有关给定对象的类(无论它是什么)的元数据,并检查它是否具有给定的注释。实例上的许多方法称为“反射操作”,或简称为“反射”。在这里阅读有关反射,为什么以及何时使用它的信息。Class

另请注意,对象表示枚举和内表以及正在运行的 Java 应用程序中的类,并具有相应的元数据。Class

总而言之 - Java中的每个对象都有(属于)一个类,并且有一个相应的对象,其中包含有关它的元数据,可以在运行时访问。Class


答案 2

Class 对象是一种描述对象类的元对象。它主要与Java的反射功能一起使用。你可以把它想象成实际类的“蓝图”。例如,你有一辆像这样的类车:

public class Car {
    public String brand;
}

然后,您可以构造一个描述“Car”类的 Class 对象。

Class myCarClass = Class.forName("Car");

现在,您可以对该类对象上的 Car 类执行各种查询:

myCarClass.getName() - returns "Car"
myCarClass.getDeclaredField("brand") - returns a Field object describing the "brand" field

等等。每个 java 对象都有一个方法 getClass(),它返回描述 Java 对象的类的 Class 对象。所以你可以做这样的事情:

Car myCar = new Car();
Class myCarClass  = myCar.getClass();

这也适用于您不知道的对象,例如您从外部获得的对象:

public void tellMeWhatThisObjectsClassIs(Object obj) {
    System.out.println(obj.getClass().getName());
}

您可以向此方法提供任何java对象,它将打印您提供给它的对象的实际类。

使用 Java 时,大多数时候您无需担心类对象。不过,他们有一些方便的用例。例如,它们允许您以编程方式实例化某个类的对象,这通常用于对象序列化和反序列化(例如,将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等类允许您分析定义的类,方法,字段,创建它们的新实例,调用各种其他方法,它们允许您在运行时动态执行此操作。


推荐