getClass()是Object类的final方法,返回对象运行时实际类型的Class对象,不依赖声明类型,是反射基础;可调用getName()、getSimpleName()等获取类信息,但无法区分泛型参数。

在 Java 中,getClass() 是 Object 类提供的一个 final 方法,用于获取当前对象在运行时的实际类(即真实类型)所对应的 Class 对象。它不依赖于声明类型,而是由 JVM 在运行时根据对象实际创建的类来决定,是反射机制的基础之一。
getClass() 的基本用法
所有 Java 类都直接或间接继承自 Object,因此任何对象实例都可以调用 getClass():
- 返回值类型为
Class<?>,代表该对象的运行时类信息; - 方法是
final的,不能被子类重写; - 即使变量声明为父类或接口类型,只要指向的是子类实例,
getClass()返回的就是子类的Class对象。
示例:
Object obj = new ArrayList<>(); System.out.println(obj.getClass()); // class java.util.ArrayList System.out.println(obj.getClass().getName()); // java.util.ArrayList System.out.println(obj.getClass().getSimpleName()); // ArrayList
与 getClass() 相关的常用 Class 操作
拿到 Class 对象后,可进一步获取类的结构和元数据:
立即学习“Java免费学习笔记(深入)”;
-
getName():返回全限定类名(如java.util.HashMap); -
getSimpleName():返回简单类名(如HashMap); -
getCanonicalName():返回规范名称,对内部类等更友好; -
isInterface()、isEnum()、isArray()等判断类型特征; -
getDeclaredMethods()、getFields()等用于反射操作。
注意:getClass() 返回的是运行时类型,不是编译时类型。例如:
List<String> list = new LinkedList<>(); System.out.println(list.getClass()); // class java.util.LinkedList(不是 List)
getClass() 与 getClass().getName() 的常见误用
有些开发者会误以为 getClass().getName() 可以替代类型判断,但需谨慎:
- 字符串比较类名容易出错(大小写、包名、内部类符号等),应优先使用
instanceof或直接比较Class对象; - 推荐方式:
obj.getClass() == String.class或obj.getClass() == MyClass.class(适用于精确匹配); - 若需判断是否为某类或其子类,用
MyClass.isAssignableFrom(obj.getClass())。
getClass() 在泛型擦除场景下的作用
Java 泛型在运行时被擦除,但 getClass() 仍能准确反映实际类型。例如:
List<String> strList = new ArrayList<>(); List<Integer> intList = new ArrayList<>(); System.out.println(strList.getClass() == intList.getClass()); // true —— 都是 ArrayList.class
这说明 getClass() 无法区分泛型参数,只能反映原始类型。如需保留泛型信息,需借助 TypeToken(如 Gson)、ParameterizedType(配合反射获取字段/方法签名)等方式。


















