0

我写了这个命令行:

Field [] field=Hello_World.class.getFields();

我使用了import java.lang.*;句子,假设导入 lang 包中的所有类。即便如此,当我编写这个命令行时,它给我一个错误并建议使用以下导入语句:import java.lang.reflect.Field; 据我所知,从 lang 包中导入特定的字段类。我不明白为什么我的原始导入语句不能解决这个问题(它应该导入所有的类,不是吗?)

4

4 回答 4

1

你有两个误解:

  • 您不需要导入java.lang. 它是隐式导入的。
  • 导入xxx.*仅导入xxx. 它不导入任何“子包” xxx;例如xxx.yyyxxx.yyy.zzz

所以你应该做的是摆脱import java.lang.*,并添加import java.lang.reflect.*.


旁白:很多人(包括我自己)认为“明星”导入类和接口是个坏主意。它可能导致源级别的脆弱性;例如,如果有人意外地将一个类添加到某个包中,该类与您从另一个包中导入的同名类发生冲突。

于 2013-07-17T05:44:00.930 回答
0

java.lang.* 导入 lang 包的所有类,但不导入其 subpackages 子类。所以要导入reflect的子类,你必须导入java.lang.reflect.Field。

于 2013-07-17T05:41:24.063 回答
0

反射不在 lang.* 包中。它的子包到语言包。你需要 import java.lang.reflect.* 它会起作用。正如其他答案暗示 import 不导入子包。

于 2013-07-17T05:46:50.020 回答
0

是的,这就是包导入在 Java 中的工作方式(并且应该工作)。比如做import javax.swing。; 将导入 javax.swing 中的所有类。但不是子包及其类。

于 2013-07-17T05:42:37.223 回答