最直接、最可靠的方式是调用 obj.getClass(),它返回对象在运行时的实际 Class 对象,不依赖编译时声明类型,也不受泛型擦除影响;该方法能准确反映对象真实类型,如 Object obj = new ArrayList<>(); 中返回 ArrayList.class,且对数组有效,但 null 时会抛出 NullPointerException。

最直接、最可靠的方式是调用 obj.getClass(),它返回对象在运行时的实际 Class 对象,不依赖编译时声明类型,也不受泛型擦除影响。
用 getClass() 获取真实类信息
每个 Java 对象都继承自 Object,而 Object 提供了 getClass() 方法。该方法返回的是 JVM 在运行时为该对象实例所分配的、唯一的 Class 对象。
- 它能准确反映对象“到底是什么类”,比如
Object obj = new ArrayList<>();中,obj.getClass()返回的是ArrayList.class,不是Object.class - 可进一步调用
getName()、getSimpleName()或getCanonicalName()获取类名字符串 - 对数组也有效:
new int[3].getClass().getName()返回[I,new String[0].getClass().getName()返回[Ljava.lang.String;
用 instanceof 做类型归属判断
instanceof 适合回答“这个对象是不是某类(或其子类)的实例”,但不能告诉你它“具体是哪个类”。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 它返回 boolean,用于条件分支,例如:
if (obj instanceof List)或if (obj instanceof String) - 对基本类型无效(如
byte、int),只适用于引用类型 - 无法处理泛型类型参数,
obj instanceof List<String>编译报错,因泛型在运行时已擦除
注意 null 和数组的特殊性
getClass() 在对象为 null 时会抛出 NullPointerException,所以安全使用必须先判空:
立即学习“Java免费学习笔记(深入)”;
if (obj == null) { /* 处理空值 */ }- 若需单独识别数组,应配合
obj.getClass().isArray()—— 它比obj instanceof Object[]更通用,能识别int[]、MyClass[][]等所有数组类型 - 数组不是 List,也不是 Collection,
getClass().isArray()返回 true 仅当对象是 JVM 原生数组实例
需要区分编译时类型和运行时类型
变量声明类型(编译时)可能只是父类或接口,而 getClass() 揭示的是实际创建的那个类:
-
List<String> list = new LinkedList<>();→list.getClass()是LinkedList.class -
Object o = "hello";→o.getClass()是String.class,不是Object.class - 这对日志输出、序列化、类型适配等场景至关重要

















