getClass() 是 Java 中获取对象实际运行时类的实例方法,返回 Class 对象,用于反射;它返回真实实例类型而非声明类型,不支持 null 和基本类型,但支持包装类和数组。

getClass() 是 Java 中每个对象都继承自 Object 类的方法,用于在运行时获取该对象的实际运行时类(即具体实例所属的 Class 对象),是反射机制中获取类元数据最基础、最常用的方式之一。
getClass() 返回的是运行时类型,不是声明类型
它返回的是对象**实际创建时的类**,而非变量声明时的类型。这对多态场景特别重要:
- 父类引用指向子类对象时,
getClass()返回子类的Class对象 - 例如:
Animal a = new Dog();,调用a.getClass()得到的是Dog.class,不是Animal.class - 这和
instanceof或isAssignableFrom配合使用,能精准判断真实类型
常见用途:获取类名、包名、泛型信息等元数据
拿到 Class 对象后,可进一步提取各类元信息:
-
getName():返回全限定类名(如"java.util.ArrayList") -
getSimpleName():返回简单类名(如"ArrayList") -
getPackage().getName():获取所在包名 -
getDeclaredFields()/getDeclaredMethods():获取本类声明的字段或方法(不含继承) -
getTypeParameters():获取泛型类型参数(如List<String>中的String信息需结合其他 API 解析)
注意 null 和基本类型的限制
getClass() 是实例方法,有明显使用边界:
立即学习“Java免费学习笔记(深入)”;
- 不能对
null调用,否则抛出NullPointerException - 基本类型(如
int、boolean)没有getClass()方法;但其包装类实例可以,如Integer.valueOf(42).getClass()返回Integer.class - 数组类型也支持:
new String[0].getClass()返回class [Ljava.lang.String;(JVM 内部表示)
替代方案:Class.forName 与 .class 字面量
并非所有场景都需通过实例调用 getClass():
- 已知类名字符串时,用
Class.forName("com.example.MyClass")动态加载 - 编译期已知类型时,直接用
MyClass.class更高效、安全(不触发初始化,也不依赖实例) -
getClass()的优势在于“无需提前知道类型”,适合通用工具方法(如日志记录、序列化框架中识别实际类型)


















