Object.getClass() 是 Java 中 java.lang.Object 类的一个非常重要的方法。由于 Object 是所有 Java 类的基类(超类),因此每个对象都继承了这个方法。它用于在运行时获取对象的 Class 对象,这个 Class 对象包含了该对象所属类的元信息。


🔍 方法签名

public final Class<?> getClass()
  • 返回类型Class<?>,一个泛型类型,表示某个类的运行时类对象。
  • final:该方法不能被子类重写,保证了其行为的统一性和安全性。

核心功能

getClass() 返回当前对象的运行时类(Runtime Class),即该对象实际所属的类,而不是引用类型。


📌 典型用途

1. 获取对象的实际类型

Object obj = "Hello";
System.out.println(obj.getClass()); // 输出: class java.lang.String

即使 objObject 类型的引用,getClass() 返回的是它实际指向的对象类型

2. 类型判断(替代 instanceof 的更精确方式)

Object obj = new ArrayList<>();

if (obj.getClass() == ArrayList.class) {
    System.out.println("这是一个 ArrayList 实例");
}

⚠️ 注意:getClass() 判断的是精确类型,不会像 instanceof 那样接受子类。例如:

List<String> list = new ArrayList<>();
System.out.println(list instanceof List);     // true
System.out.println(list.getClass() == List.class); // false,因为 List 是接口,不能实例化
System.out.println(list.getClass() == ArrayList.class); // true

3. 反射编程(Reflection)

Class 对象是 Java 反射机制的基础,可用于动态创建对象、调用方法、访问字段等。

Object obj = "Hello";
Class<?> clazz = obj.getClass();

// 获取类名
System.out.println("类名: " + clazz.getName()); // java.lang.String

// 获取所有公共方法
Method[] methods = clazz.getMethods();
for (Method m : methods) {
    System.out.println(m.getName());
}

4. 泛型类型擦除后获取真实类型(配合反射)

在某些框架(如 Jackson、Hibernate)中,getClass() 常用于确定泛型集合中元素的实际类型。


⚠️ 注意事项

项目 说明
❌ 不可重写 getClass()final 方法,不能被覆盖。
🧩 区别于 .class String.class 是编译时获取类对象;obj.getClass() 是运行时获取实际类型。
🧱 基本类型不适用 int, double 等基本类型不是对象,不能调用 getClass()。但其包装类可以:Integer.valueOf(5).getClass()
🔄 多态中体现运行时类型 在继承体系中,getClass() 返回的是最终实例的类,而不是父类引用类型。

🧪 示例:多态中的 getClass()

class Animal {}
class Dog extends Animal {}

public class Test {
    public static void main(String[] args) {
        Animal a = new Dog();
        System.out.println(a.getClass()); // 输出: class Dog
        System.out.println(a instanceof Animal); // true
        System.out.println(a instanceof Dog);    // true
    }
}

✅ 尽管 a 的引用类型是 Animal,但 getClass() 返回的是 Dog,体现了运行时类型信息(RTTI)


✅ 最佳实践

  • 使用 getClass() 进行精确类型比较
  • 在日志、调试、序列化、框架开发中,常用于动态获取类型信息。
  • 避免与 .class 混淆:.class 用于类字面量,getClass() 用于实例。

🔚 总结

方法 作用
obj.getClass() 获取对象的运行时类(Class 对象)
类名.class 获取类的 Class 对象(编译时)
instanceof 判断是否是某类型或其子类
getClass() == X.class 判断是否是精确的 X 类型

getClass() 是 Java 类型系统和反射机制的基石之一,掌握它有助于深入理解 Java 的动态性和多态性。