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

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

在运行时,我可以使用

Fruit fruit = new Apple();

fruit.getClass();@H_301_5@ 
 

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

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

但有没有办法确定水果标识符的声明类型?在这种情况下,水果.

解决方法

您实际上是在询问有关水果变量声明的问题而不是对象的实际运行时类型(在这种情况下是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@H_301_5@ 
 

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

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

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

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...