Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.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_Class_Reflection_Runtime_Polymorphism - Fatal编程技术网

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

如何在Java中找到标识符的声明类型?,java,class,reflection,runtime,polymorphism,Java,Class,Reflection,Runtime,Polymorphism,我有一个简单的类苹果从另一个简单的类水果延伸 在运行时,我可以使用 Fruit fruit = new Apple(); fruit.getClass(); 获取水果对象的实际类型,即Apple.class 我还可以使用苹果的水果实例,和水果的水果实例来验证这个水果对象是苹果还是水果的实例。这两个表达式都返回true,这是正常的 但是有没有一种方法可以精确地确定水果标识符的声明类型?在本例中是Fruit您实际上是在询问Fruit的变量声明,而不是对象的实际运行时类型(在本例中是Apple)

我有一个简单的类苹果从另一个简单的类水果延伸

在运行时,我可以使用

Fruit fruit = new Apple();

fruit.getClass();
获取水果对象的实际类型,即Apple.class

我还可以使用苹果的
水果实例
,和
水果的水果实例
来验证这个水果对象是苹果还是水果的实例。这两个表达式都返回true,这是正常的


但是有没有一种方法可以精确地确定
水果
标识符的声明类型?在本例中是
Fruit

您实际上是在询问
Fruit
的变量声明,而不是对象的实际运行时类型(在本例中是
Apple

我认为这通常是一个坏主意:您刚刚声明了变量,并告诉编译器它是一个
水果
,那么为什么您现在需要找出这一点呢

更让人困惑的是,值得注意的是,您还可以有多个变量,它们具有不同的声明类型,引用同一个对象(仍然是一个苹果):

如果您确实想找出声明的类型,那么您有几个选项:

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

我认为所有这些都很难看,所以我的一般建议是“不要这样做”。这个
Fruit
对象没有声明的类型。有其类型的是变量
水果
。由于您可以传递的唯一内容是对
Fruit
对象的引用,因此我认为您的请求没有多大意义。最好是在存储对象的地方有一个特定的实例变量。然后可以对该字段进行反射,并使用
field.getType()
获取其声明的类型。不,没有:至少不使用反射。反射可以在运行时为您提供有关对象以及字段、方法和类的信息,但不能提供局部变量的信息。如果水果是一块地,你可以做如下事情:

FruitBasket.class.getDeclaredField("fruit").getType();

你应该描述一下你想要达到的效果。我相信还有其他方法可以解决这个原始问题。我很好奇为什么你想知道(水果是如何声明的),另外,为什么你还不知道(因为你面前有代码)。我不会想出一个用例。
水果
指向的对象是一个
苹果
。您通过
fruit
变量与它的接口是
fruit
,但这纯粹是编译时的事情。这样做的意义是什么?您已经将fruit编码为fruit,所以您已经知道它是什么。谢谢大家的评论,我问这个问题只是出于好奇。我想如果我能知道对象的实际类型,就有可能知道指向对象的变量的声明类型。但事实上,我还没有找到任何用例。我可能想错了,比如把这个水果变量传递给一个方法,我怎么知道这个水果变量在方法中的声明类型。我想我做不到,这没有道理。谢谢。真是个坏主意。值得一提的是,变量是一个编译时实体。如果编译器对它进行优化,它在运行时可能根本不存在。谢谢@mikera,我想你是对的。我的问题没有多大意义。我想知道如果我能得到对象的实际运行时类型,我还可能得到引用这个对象的声明变量的类型。但谢谢你:)
FruitBasket.class.getDeclaredField("fruit").getType();