首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是类对象(java.lang.Class)?

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

Stack Overflow用户
提问于 2010-12-16 02:10:24
回答 7查看 79.3K关注 0票数 87

Class的Java文档说:

Class对象是由Java Virtual Machine在加载类时自动构造的,并通过调用类加载器中的defineClass方法来实现。

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

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-12-16 02:13:34

任何内容都不会被类型转换为Class。Java中的每个Object都属于某个class。这就是所有其他类继承的Object类定义getClass()方法的原因。

getClass()Foo.class -getClass()返回一个Class对象,该对象包含有关类的一些元数据:

  • name
  • package
  • methods
  • fields
  • constructors
  • annotations

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

因此,例如,如果您的一个方法被赋予了一个对象,并且您希望在使用@Processable注释对其进行处理时对其进行处理,那么:

代码语言:javascript
复制
public void process(Object obj) {
    if (obj.getClass().isAnnotationPresent(Processable.class)) {
       // process somehow; 
    }
}

在本例中,您将获得有关给定对象的类的元数据(无论它是什么),并检查它是否具有给定的注释。Class实例上的许多方法被称为“反射操作”,或者简称为“反射。Read here关于反射,为什么以及何时使用它。

还要注意,Class对象表示正在运行的Java应用程序中的枚举和接口以及类,并且具有各自的元数据。

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

票数 102
EN

Stack Overflow用户

发布于 2010-12-16 02:25:25

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

代码语言:javascript
复制
public class Car {
    public String brand;
}

然后你可以构造一个class对象来描述你的"Car“类。

代码语言:javascript
复制
Class myCarClass = Class.forName("Car");

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

代码语言:javascript
复制
myCarClass.getName() - returns "Car"
myCarClass.getDeclaredField("brand") - returns a Field object describing the "brand" field

诸若此类。每个java对象都有一个方法getClass(),该方法返回描述Java对象的类的类对象。所以你可以这样做:

代码语言:javascript
复制
Car myCar = new Car();
Class myCarClass  = myCar.getClass();

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

代码语言:javascript
复制
public void tellMeWhatThisObjectsClassIs(Object obj) {
    System.out.println(obj.getClass().getName());
}

你可以给这个方法提供任何java对象,它会打印出你给它的对象的实际类。

在使用Java时,大多数情况下您不需要担心Class对象。不过,他们有一些方便的用例。例如,它们允许您以编程方式实例化某个类的对象,这通常用于对象序列化和反序列化(例如,将Java对象与XML或JSON来回转换)。

代码语言:javascript
复制
Class myCarClass = Class.forName("Car");
Car myCar = myCarClass.newInstance();  // is roughly equivalent to = new Car();

你也可以用它来找出你的类的所有声明的字段或方法等,这在某些情况下非常有用。因此,例如,如果你的方法得到了一个未知的对象,而你需要了解更多关于它的信息,比如它是否注入了一些接口等,那么Class类就是你的朋友。

长话短说,java.lang.reflect包中的类、字段、方法等类允许您分析已定义的类、方法、字段,创建它们的新实例,调用方法所有其他类型的东西,它们允许您在运行时动态执行这些操作。

票数 47
EN

Stack Overflow用户

发布于 2010-12-16 02:16:49

getClass()是一个方法,它返回一个对象,该对象是java.lang.Class的一个实例...没有涉及到造型。造型将如下所示:

代码语言:javascript
复制
Class<?> type = (Class<?>) object;
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4453349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档