我写了这个命令行:
Field [] field=Hello_World.class.getFields();
我使用了import java.lang.*;
句子,假设导入 lang 包中的所有类。即便如此,当我编写这个命令行时,它给我一个错误并建议使用以下导入语句:import java.lang.reflect.Field; 据我所知,从 lang 包中导入特定的字段类。我不明白为什么我的原始导入语句不能解决这个问题(它应该导入所有的类,不是吗?)
你有两个误解:
java.lang
. 它是隐式导入的。xxx.*
仅导入xxx
. 它不导入任何“子包” xxx
;例如xxx.yyy
或xxx.yyy.zzz
。所以你应该做的是摆脱import java.lang.*
,并添加import java.lang.reflect.*
.
旁白:很多人(包括我自己)认为“明星”导入类和接口是个坏主意。它可能导致源级别的脆弱性;例如,如果有人意外地将一个类添加到某个包中,该类与您从另一个包中导入的同名类发生冲突。
java.lang.* 导入 lang 包的所有类,但不导入其 subpackages 子类。所以要导入reflect的子类,你必须导入java.lang.reflect.Field。
反射不在 lang.* 包中。它的子包到语言包。你需要 import java.lang.reflect.* 它会起作用。正如其他答案暗示 import 不导入子包。
是的,这就是包导入在 Java 中的工作方式(并且应该工作)。比如做import javax.swing。; 将导入 javax.swing 中的所有类。但不是子包及其类。