【问题标题】:Java import sentence [duplicate]Java导入语句[重复]
【发布时间】:2013-07-17 05:39:17
【问题描述】:

我写了这个命令行:

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

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

【问题讨论】:

  • 您可以检查可能的 dup 问题,import 不会递归地从其中的包中获取类。

标签: java import


【解决方案1】:

你有两个误解:

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

所以你应该做的是去掉import java.lang.*,添加import java.lang.reflect.*


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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-15
          • 2017-10-13
          • 2013-04-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-17
          • 1970-01-01
          相关资源
          最近更新 更多