如何在Java中检查变量本身的类型而非其值的类型?
获取Java变量的声明类型而非运行时类型
这个问题确实戳中了Java里一个容易混淆的点——变量的声明类型和实际引用对象的运行时类型是完全两回事儿!你用getClass().getSimpleName()拿到的是后者,也就是实际赋值对象的类型,这就是为什么Object ob = "Some String"会输出String的原因。
那怎么拿到变量本身的声明类型呢?分两种场景来看:
1. 成员变量(字段):用反射获取
如果是类的成员变量,可以通过Java反射API的Field.getType()方法直接获取它的声明类型,示例代码如下:
public class TypeDemo { // 声明类型为Object的成员变量 private Object ob = "Some String"; public static void main(String[] args) throws NoSuchFieldException { // 获取类的字段 Field field = TypeDemo.class.getDeclaredField("ob"); // 获取字段的声明类型并输出简单名称 System.out.println(field.getType().getSimpleName()); // 输出"Object" } }
这个方法能精准拿到变量在代码里声明的类型,不管实际赋值的对象是什么类型。
2. 局部变量:无法通过常规反射获取
如果是方法里的局部变量,比如:
public void test() { Object ob = "Some String"; // 想拿到ob的声明类型Object }
抱歉,常规的Java反射API做不到这一点。因为局部变量不会被记录在类的字节码元数据里,编译后JVM不会保留局部变量的声明类型信息(除非你开启了调试信息,但也只能通过字节码分析工具读取)。
如果一定要获取局部变量的声明类型,只能借助ASM、Javassist这类字节码操作库去解析class文件,但这属于进阶操作,一般业务场景下完全没必要——毕竟你写代码的时候自己就知道局部变量的声明类型了嘛 😄
总结一下:成员变量用反射Field.getType(),局部变量要么自己明确知道,要么用字节码工具解析。
内容的提问来源于stack exchange,提问作者user5818995
相关产品推荐
相关产品推荐

