【问题标题】:import statement byte code significanceimport语句字节码意义
【发布时间】:2012-03-13 08:04:55
【问题描述】:

可以说,一个类中有一些导入语句。当为该类生成字节码时,这些导入语句会发生什么。

如果在运行时忽略了 import 语句,那么在运行时如何解决对这些类方法的依赖关系。

【问题讨论】:

  • 为什么不自己去寻找呢?编写一个类的一些变体:一个依赖于外部类,一个依赖于(例如)java.util.List 通过导入,一个依赖于List,但使用它完全限定(没有导入)。然后在每个上使用javap -c,看看会发生什么。
  • 对@yshavit 注释的补充,在编译期间使用javac -g:none Foo.java.class 文件中根本不生成调试信息(例如行号),然后比较生成的.classes 和它们在字节级别上将是相同的,这可以通过测试获取它们中的每一个的哈希值。

标签: java compiler-construction import bytecode


【解决方案1】:

import 语句的目的只是为了让代码的人类读者(和作者)更轻松。因此,它们被对字节码中完全限定的类/方法名的引用所取代。并且忽略未使用的导入语句。

【讨论】:

    【解决方案2】:

    Java 中的 import 只是一种简写

    因此,如果您导入 java.util.*,您不必在代码中编写 java.util.ArrayList,但可以编写 ArrayList

    【讨论】:

      【解决方案3】:

      import 语句仅适用于编译器,因此它知道您可以在代码中不限定访问哪些类名(或静态方法名)(即MyClass 而不是foo.bar.MyClass)。在幕后,这只是用来解析完全限定的类名,然后在字节码中使用。

      【讨论】:

      • 用于将非限定名称解析为完全限定名称。
      • 这就是我的意思。我不应该在半睡半醒的时候用外语写作;)
      猜你喜欢
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 2012-06-19
      相关资源
      最近更新 更多