什么是 Class 对象 (java.lang.Class)?
类
的Java文档说:
Class
对象由 Java 虚拟机在装入类时自动构造,并通过调用类装入器中的方法自动构造。defineClass
这些对象是什么?它们是否与通过调用从类实例化的对象相同?Class
new
另外,例如,即使我没有继承,如何将所有内容都类型转换为超类?object.getClass().getName()
Class
java.lang.Class
类
的Java文档说:
Class
对象由 Java 虚拟机在装入类时自动构造,并通过调用类装入器中的方法自动构造。defineClass
这些对象是什么?它们是否与通过调用从类实例化的对象相同?Class
new
另外,例如,即使我没有继承,如何将所有内容都类型转换为超类?object.getClass().getName()
Class
java.lang.Class
没有任何内容被类型转换为 。Java中的每一个都属于某个.这就是由所有其他类继承的类定义方法的原因。Class
Object
class
Object
getClass()
getClass()
或类文字 - 返回一个对象,其中包含有关该类的一些元数据:Foo.class
Class
和一些有用的方法,如铸造和各种检查(,等)。javadoc 准确地显示了您可以获得的有关类的信息。isAbstract()
isPrimitive()
因此,例如,如果为你的一个方法指定了一个对象,并且您希望在用注释注释它的情况下对其进行处理,那么:@Processable
public void process(Object obj) {
if (obj.getClass().isAnnotationPresent(Processable.class)) {
// process somehow;
}
}
在此示例中,您将获取有关给定对象的类(无论它是什么)的元数据,并检查它是否具有给定的注释。实例上的许多方法称为“反射操作”,或简称为“反射”。在这里阅读有关反射,为什么以及何时使用它的信息。Class
另请注意,对象表示枚举和内表以及正在运行的 Java 应用程序中的类,并具有相应的元数据。Class
总而言之 - Java中的每个对象都有(属于)一个类,并且有一个相应的对象,其中包含有关它的元数据,可以在运行时访问。Class
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等类允许您分析定义的类,方法,字段,创建它们的新实例,调用各种其他方法,它们允许您在运行时动态执行此操作。