如何在Java中检查变量的类型?
我在StackOverflow上见过许多标题类似的问题,但所有这些答案似乎都建议使用如何在Java中检查变量的类型?,java,reflection,types,Java,Reflection,Types,我在StackOverflow上见过许多标题类似的问题,但所有这些答案似乎都建议使用getClass().getSimpleName()方法。问题是我不想知道变量所持有的值的类型,我对变量本身的类型感兴趣。在下面的代码中,我想打印对象,而不是字符串: Object ob = "Some String"; System.out.println(ob.getClass().getSimpleName()); // prints "String" 假设变量的类型是它所持有的值的超级类型,我可以检查该
getClass().getSimpleName()
方法。问题是我不想知道变量所持有的值的类型,我对变量本身的类型感兴趣。在下面的代码中,我想打印对象
,而不是字符串
:
Object ob = "Some String";
System.out.println(ob.getClass().getSimpleName()); // prints "String"
假设变量的类型是它所持有的值的超级类型,我可以检查该值是否是某个类的instanceof
。但是,instanceof
将为所有超类返回true,直到我们到达层次结构中的对象为止。有没有办法专门检查变量的类型
在生产代码中可能没有任何实际的用例,但是了解变量类型可以使泛型更易于实践。考虑这种方法:
public static <T> void test (T a, T b) {
}
公共静态空隙试验(TA、TB){
}
我们不知道当使用两个不同的参数调用
test
时,编译器会推断出什么类型。打印出替换为的T
可能会有所帮助。我们知道,T将被替换为程序运行时两个参数的类型继承自的最特定的类型。但是如果我要打印那种类型,我就不能了。您将无法从一个对象转到保存它的“变量”(至少据我所知)。因此,如果示例中的ob
是局部变量,则无法获取其声明的类型
考虑到一个对象可以由不同声明的数据类型的多个变量指向,解析对象的“声明”类型将是一种奇怪的尝试(这只是我的观点)
只要对象存在,重要的就是它的运行时、具体类型(可以通过obj.getClass()
访问),即提供对其类型层次结构的访问
对于存储在类成员字段中的对象(假设您知道字段名),可以获取声明的字段类型:
DeclaringClass.class
.getDeclaredField("fieldName")
.getType()
.getSimpleName();
局部变量的类型仅在调试信息中可用 你可以
- 使用调试信息编译
- 阅读调试信息的字节码,找出您要查找的字节码
然而,一个更简单的解决方案是编写一个程序,这样您就不需要知道这一点。e、 g.将数据存储在字段中,而不是本地变量。您在编译时就知道,Java支持运行时多态性,因此在运行时,所有引用都会保存实际对象,因此,我猜除了Sweeper之外,没有其他方法:因为变量的类型在编译时已知,所以您的语句应该是
System.out.println(Object.class.getSimpleName())
。这看起来很琐碎(或毫无意义)-或者你能指定你真正的问题吗?除了已经说过的:请注意,如果你将这个对象传递给一个方法,那将需要一个新变量,因此那里不会有对原始变量的引用。可能是