如何在Java中找出声明的标识符类型?

Kew*_*ang 7 java reflection polymorphism runtime class

我有一个简单的类Apple扩展自另一个简单的类Fruit.

在运行时,我可以使用

Fruit fruit = new Apple();

fruit.getClass();
Run Code Online (Sandbox Code Playgroud)

获取实际类型的水果对象,即Apple.class.

我也可以使用fruit instanceof Apple,并fruit instanceof Fruit验证这个水果对象是Apple还是Fruit的实例.这两个表达式都返回true,这是正常的.

但有没有办法确定fruit标识符的声明类型?在这种情况下是Fruit.

mik*_*era 12

您实际上是在询问有关变量声明的问题fruit而不是对象的实际运行时类型(Apple在本例中是这样).

我认为这通常是一个坏主意:你刚刚声明了变量并告诉编译器它是一个Fruit,所以为什么你现在需要找到它呢?

只是为了更加混淆事情,值得注意的是,您还可以使用引用同一对象(仍然是Apple)的不同声明类型的多个变量:

Fruit fruit = new Apple(); // fruit declared as Fruit, but refers to an Apple
Object thing = fruit;      // thing declared as Object, refers to the same Apple
Run Code Online (Sandbox Code Playgroud)

如果你真的想找出声明的类型,那么你有几个选择:

  • 创建fruit一个实例变量,并使用反射查询声明的类型.
  • 对源代码进行一些处理以找到变量声明
  • 对编译后的字节码进行一些处理以找到声明类型(尽管有可能一个积极的编译器甚至可能完全优化编译时声明,例如在认识到水果只能在此代码中成为Apple之后)

我认为所有这些都非常难看,所以我的一般建议是"不要这样做".

  • 确实是个坏主意.值得一提的是变量是一个编译时实体.如果编译器优化它,它可能在运行时根本不存在. (2认同)