Class这东西真的是基础中的基础,先不整专业的说辞:
在Java中,每个类都有一个对应的Class
对象,这与通过new
关键字创建的具体对象实例是不同的
Class对象
想象一下,你是一名建筑师,你设计了一张房子的蓝图。这张蓝图包含了建造房子所需的所有信息,比如房间布局、门窗尺寸、材料清单等。这张蓝图就是Java中的Class
对象。它包含了类的全部信息,比如类名、字段、方法、构造函数等。Class
对象不占用内存空间,它更像是一个模板或指导手册,告诉你如何创建一个类的实例。
对象实例
现在,你根据蓝图开始建造房子,最终建成了一个实体的房子。这个实体房子就是一个类的实例,也就是通过new
关键字创建的对象。这个实例占用了内存空间,拥有自己的状态(字段的值),并且可以执行行为(调用方法)。每个实例都是独立的,有自己的属性值,可以单独操作和改变。
比喻解释
- 蓝图(Class对象):告诉你如何构建一个类的实例,包含了类的所有信息,但不占用内存空间,不能直接操作或改变。
- 实体房子(对象实例):根据蓝图建造出来的实际存在,每个房子(实例)都有自己的地址(内存地址),可以居住(使用),并且可以装修(改变状态)。
总结一下,Class
对象就像是指导手册或蓝图,它描述了如何创建和使用一个类的实例。而通过new
关键字创建的对象实例,则是根据这个蓝图实际建造出来的房子,它们占据了内存空间,有自己的状态和行为。在Java中,你通常不会直接操作Class
对象,除非你在进行反射操作或需要元数据信息。而你大部分时间都在操作由Class
对象创建出来的对象实例。
专业的说法:
Class
对象代表了程序中的一个类或基本类型的运行时表示。当你有一个类,比如ApplicationListener
,它的Class
对象提供了关于这个类的元数据和一些操作方法。Class
对象可以被视为一个类的“蓝图”或“模板”,它包含了类的信息,如类名、修饰符、方法、字段、构造函数、内部类等,以及类的完整类层次结构。
Class
对象包括但不限于执行以下几种操作:
-
获取类的元信息:如类名、包名、简单名、修饰符、字段、方法、构造函数等。
-
实例化对象:通过
newInstance()
方法或getDeclaredConstructor().newInstance()
来创建类的实例,这在反射编程中非常常见。 -
调用方法:可以使用
getMethod()
或getDeclaredMethod()
来获取方法,然后使用invoke()
方法调用该方法。 -
访问和修改字段:通过
getField()
或getDeclaredField()
获取字段,然后使用get()
和set()
方法读取或修改字段的值。 -
创建数组:
Class
对象可以用来创建特定类型的数组。 -
类型转换和检查:可以使用
isAssignableFrom()
或isInstance()
来检查一个类是否可以分配给另一个类或一个对象是否属于某个类。 -
获取类的类加载器:
getClassLoader()
方法可以返回加载该类的类加载器。 -
获取和设置注解:可以使用
getAnnotation()
和getAnnotations()
来获取类上的注解,也可以使用反射为类添加注解。 -
获取类的超类和接口:
getSuperclass()
和getInterfaces()
可以获取类的父类和实现的接口。
TIPS:Class
对象可以用来获取加载这个类的类加载器。这可以通过调用Class
对象的getClassLoader()
方法实现。不过值得注意的是,如果Class
对象代表的是java.lang.Object
或其它Java核心类库中的类,由于它们是由引导类加载器(Bootstrap ClassLoader)加载的,而引导类加载器在Java中没有直接的ClassLoader
表示,因此getClassLoader()
方法会返回null
。
总之,Class
对象在Java中提供了一种强大的工具,用于在运行时获取和操作类的信息。