Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中检查变量的类型?_Java_Reflection_Types - Fatal编程技术网

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

如何在Java中检查变量的类型?,java,reflection,types,Java,Reflection,Types,我在StackOverflow上见过许多标题类似的问题,但所有这些答案似乎都建议使用getClass().getSimpleName()方法。问题是我不想知道变量所持有的值的类型,我对变量本身的类型感兴趣。在下面的代码中,我想打印对象,而不是字符串: Object ob = "Some String"; System.out.println(ob.getClass().getSimpleName()); // prints "String" 假设变量的类型是它所持有的值的超级类型,我可以检查该

我在StackOverflow上见过许多标题类似的问题,但所有这些答案似乎都建议使用
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())
。这看起来很琐碎(或毫无意义)-或者你能指定你真正的问题吗?除了已经说过的:请注意,如果你将这个对象传递给一个方法,那将需要一个新变量,因此那里不会有对原始变量的引用。可能是