getclass()是object类中获取运行时类信息最基础的方式,返回当前对象真实类型的class对象,不可重写、非null且唯一标识该类;可调用getname()等方法获取结构信息,结合反射操作私有成员,区别于instanceof和class.forname()。

Java 中 Object 类的 getClass() 方法是获取运行时类信息最基础、最直接的方式。它返回当前对象所属的 Class 对象,这个对象封装了该类在 JVM 中的完整元数据,比如类名、父类、接口、字段、方法等。
getClass() 返回的是运行时真实类型
该方法不受声明类型影响,只看实际创建的对象类型。例如:
Object obj = new ArrayList(); System.out.println(obj.getClass().getName()); // java.util.ArrayList
即使变量声明为 Object,只要实际是 ArrayList 实例,getClass() 就返回 ArrayList 的 Class 对象。
- 不能被子类重写(
final方法),保证行为一致 - 所有类都继承自
Object,所以任意对象都能调用 - 返回值非
null,且唯一标识该类在当前类加载器下的身份
用 getClass() 获取类的基本结构信息
拿到 Class 对象后,可进一步查询类的结构:
-
getName():全限定类名(如java.lang.String) -
getSimpleName():简单类名(如String) -
getSuperclass():直接父类的Class对象(Object返回null) -
getInterfaces():实现的接口数组 -
isInterface()、isPrimitive()、isArray()等判断类型特征
这些方法都是在运行期执行的,不依赖编译时类型,适合做泛型擦除后的类型识别或框架中通用对象处理。
结合反射动态操作对象
有了 Class 对象,就能安全地使用反射访问私有成员或调用方法:
- 通过
getDeclaredField("fieldName")获取字段,再用setAccessible(true)访问私有字段 - 用
getMethod("methodName", paramTypes)查找并调用公开方法 - 配合
newInstance()(已过时)或getDeclaredConstructor().newInstance()创建新实例
注意:反射操作受安全管理器和模块系统限制,生产环境需谨慎使用,尤其涉及 setAccessible(true) 时。
与 instanceof 和 Class.forName() 的区别
getClass() 关注“具体是什么类”,而 instanceof 判断“是否属于某类型或其子类型”。例如:
ArrayList list = new ArrayList(); System.out.println(list instanceof List); // true System.out.println(list.getClass() == List.class); // false(List 是接口,不能 new) System.out.println(list.getClass() == ArrayList.class); // true
Class.forName("xxx") 是通过字符串加载类(可能触发初始化),而 getClass() 不加载新类,只返回已有实例对应的已加载类对象。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











