在Java中,new Object()
和通过反射获取的 Class
对象之间是 实例(Instance)与类的元数据(Class Metadata) 的关系。
1. new Object()
的作用
-
创建一个 类的实例(即对象),分配内存空间并调用构造函数。
Object obj = new Object(); // 创建一个 Object 类的实例
2. 反射获取的 Class
对象
-
Class
对象是 类的元数据,用于描述类的结构(如字段、方法、构造函数等)。 -
通过反射获取
Class
对象的常见方式:Class<?> clazz1 = Object.class; // 直接通过类字面量获取 Class<?> clazz2 = obj.getClass(); // 通过实例的 getClass() 方法获取 Class<?> clazz3 = Class.forName("java.lang.Object"); // 通过全限定类名动态加载
3. 两者的核心关系
特性 | new Object() (实例) | Class 对象(元数据) |
---|---|---|
本质 | 类的具体实例,存储在堆内存中。 | 类的描述信息,存储在方法区(元空间)。 |
作用 | 存储对象的数据(状态)。 | 描述类的结构(字段、方法、构造函数等)。 |
获取方式 | new 关键字。 | getClass() 、Class.forName() 。 |
单例性 | 每个 new 操作生成不同的实例。 | 同一类加载器下,一个类只有一个 Class 对象。 |
注意:Class对象不在方法区或运行时常量池(直接引用堆地址):它位于堆中,运行时常量池仅存储其引用。
4. 关键联系
(1) 实例与 Class
对象
每个实例都可以通过 getClass()
方法获取其对应的 Class
对象:
Object obj = new Object();
Class<?> clazz = obj.getClass(); // 返回 Object.class
(2) 通过 Class
对象创建实例
反射可以通过 Class
对象动态创建实例(类似于 new
的功能):
Class<?> clazz = Object.class;
Object instance = clazz.newInstance(); // 调用无参构造函数创建实例(已废弃,推荐用 getConstructor().newInstance())
(3) 类的单例性
同一类加载器下,一个类的 Class
对象是唯一的:
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println(obj1.getClass() == obj2.getClass()); // true(两个实例的 Class 对象相同)
System.out.println(Object.class == obj1.getClass()); // true
总结
new Object()
:创建类的实例(对象),是程序运行时的具体数据。Class
对象:是类的元数据,描述类的结构,用于反射操作。- 关系:每个实例都关联一个
Class
对象(通过getClass()
),而Class
对象可以创建更多实例或分析类的结构。