java - 如何检查Java中变量的类型?

标签 java reflection types

我在 StackOverflow 上看到过许多标题相似的问题,但所有这些答案似乎都暗示了 getClass().getSimpleName() 方法。问题是我不想知道变量持有的值的类型,我对变量本身的类型感兴趣。在下面的代码中,我想打印 Object,而不是 String:

Object ob = "Some String";
System.out.println(ob.getClass().getSimpleName()); // prints "String"

假设变量的类型是它所持有的值的父类(super class)型,我可以检查该值是否是某个类的instanceof。但是 instanceof 将为所有父类(super class)返回 true,直到我们到达层次结构中的 Object。有没有办法专门检查变量的类型?

在生产代码中可能没有任何实际用例,但了解变量类型可能会使泛型更容易实践。考虑这种方法:

public static <T> void test (T a, T b) {

}

当使用两个不同的参数调用 test 时,我们不知道编译器会推断出什么类型。打印出 T 替换的内容可能会有所帮助。我们知道 T 将被替换为两个参数的类型在程序运行时继承的最具体的类型。但如果我要打印那种类型,我就做不到。

最佳答案

您无法从一个对象转到包含它的“变量”(至少据我所知)。因此,如果您的示例中的 ob 是局部变量,您将无法获取其声明的类型

考虑到一个对象可以被不同声明数据类型的多个变量指向,解决对象的“已声明”类型(这只是我的意见)。

只要对象存在,重要的是它的运行时、具体类型(可通过 obj.getClass() 访问)以及提供对其类型层次结构的访问的东西。

对于存储在类成员字段中的对象(假设知道字段名),可以获取声明的字段类型:

DeclaringClass.class
    .getDeclaredField("fieldName")
    .getType()
    .getSimpleName();

关于java - 如何检查Java中变量的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50036159/

相关文章:

Java:从类中打印/返回数组

go - 类型定义 - 不能使用基本类型作为自定义类型,即使基本类型是自定义类型的源

java - JasperReports 需要 Jars 吗?

java - 新窗口无法加载

java - 反射(reflection):有效的,很棒的,必要的用途

java注释-运行时自动使用

java - 在枚举中使用反射但总是得到 NoSuchMethodException

haskell - 在 Haskell 中处理来自第三方库的数据类型的最佳实践?

types - 命名和未命名类型

javascript - 如何构建一个每天调用另一个javascript文件的Java文件?