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

Car*_*zer 72 java inheritance class

Java文档Class说:

ClassJava虚拟机在加载类时自动构造对象,并通过调用defineClass类加载器中的方法.

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

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

Boz*_*zho 88

什么都没有被贬低Class.ObjectJava中的每一个都属于某种特定的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; 
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,您将获取有关给定对象的类的元数据(无论它是什么),并检查它是否具有给定的注释.Class实例中的许多方法称为"反射操作",或简称为"反射.请阅读此处关于反射,使用的原因和时间.

还要注意,枚举和接口也表示一个Class对象,并具有相应的元数据.

总结一下 - java中的每个对象都有(属于)一个类,并且有一个相应的Class对象,它包含有关它的元数据,可以在运行时访问.

  • 而且进一步思考这个很有趣.`Class`类继承自`Object`本身.`Class.class`返回一个表示`Class`类的`Class`对象.你可以反思一下.我的头脑. (34认同)

Jan*_*omä 41

Class对象是一种描述对象类的元对象.它主要用于Java的反射功能.您可以将其视为实际课程的"蓝图".例如,你有这样的类汽车:

public class Car {
    public String brand;
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以构造一个描述"Car"类的Class对象.

Class myCarClass = Class.forName("Car");
Run Code Online (Sandbox Code Playgroud)

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

myCarClass.getName() - returns "Car"
myCarClass.getDeclaredField("brand") - returns a Field object describing the "brand" field
Run Code Online (Sandbox Code Playgroud)

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

Car myCar = new Car();
Class myCarClass  = myCar.getClass();
Run Code Online (Sandbox Code Playgroud)

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

public void tellMeWhatThisObjectsClassIs(Object obj) {
    System.out.println(obj.getClass().getName());
}
Run Code Online (Sandbox Code Playgroud)

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

使用Java时,大多数时候您不需要担心Class对象.他们有一些方便的用例.例如,它们允许您以编程方式实例化特定类的对象,这些对象经常用于对象序列化和反序列化(例如,将Java对象转换为XML并返回,大部分时间都是这样).

Class myCarClass = Class.forName("Car");
Car myCar = myCarClass.newInstance();  // is roughly equivalent to = new Car();
Run Code Online (Sandbox Code Playgroud)

您还可以使用它来查找类的所有声明的字段或方法等,这在某些情况下非常有用.因此,例如,如果您的方法被传递给一个未知对象,并且您需要了解更多信息,比如它是否会影响某些界面等,那么Class类就是您的朋友.

长话短说,java.lang.reflect包中的Class,Field,Method等类允许你分析你定义的类,方法,字段,创建它们的新实例,调用各种其他东西的方法它们允许您在运行时动态执行此操作.

  • 它基本上是语法糖.它是编译器评估的东西,用于加载具有给定名称的类对象.大致相当于Class.forName("完全限定类名")但是在编译时检查类是否存在,而Class.forName()是在运行时执行的. (4认同)
  • 类 c1 = Car.class;这个“类”是什么?它是每个类中都存在的公共变量吗? (2认同)

Col*_*inD 8

getClass()是一个返回对象的方法,该对象是...的实例,java.lang.Class不涉及转换.投射看起来像这样:

Class<?> type = (Class<?>) object;
Run Code Online (Sandbox Code Playgroud)


Kor*_*gay 6

我还想补充一下ColinD的答案,即getClass将为相同类型的实例返回相同的对象。这将显示true

    MyOtherClass foo = new MyOtherClass();
    MyOtherClass bar = new MyOtherClass();
    System.out.println(foo.getClass()==bar.getClass());
Run Code Online (Sandbox Code Playgroud)

请注意,不是equals,我正在使用==