gpt4 book ai didi

kotlin - Kotlin中import如何找到文件路径?

转载 作者:行者123 更新时间:2023-12-02 18:04:13 32 4
gpt4 key购买 nike

我已经阅读了 Kotlin 文档 ( https://kotlinlang.org/docs/packages.html ),并且我了解到,在导入包时,包名称不需要与存储包的文件夹路径匹配(与 Java 中发生的情况不同)。

我在创建包并将其导入其他类时没有遇到问题。

我想了解的是,编译器如何找到要导入的文件?

例如:

如果文件导入animals.mammals.cats.*:

import animals.mammals.cats.*

...

要导入的实体不需要存储在文件/animals/mammals/cats.kt中,只要包名为“animals.mammals.cats”即可:

package animals.mammals.cats

...

例如,此 Kotlin 文件可以存储在 src/animals/kittens 中。

换句话说,由于包名称没有帮助,import 如何定位要加载的文件?

谢谢!

最佳答案

TL;DR:编译器获得了所有要编译的文件和所有依赖项的路径,因此知道所有可用的包及其包含的声明。


首先,请注意 import声明本身并不是最重要的。这只是一种方便的语法,可以避免在整个文件中的任何地方指定包。但从技术上讲,您不需要导入任何内容就可以使用当前文件外部的声明 - 您只需使用它们的完全限定名称(又名 FQN),即包名称 + . + 声明的名称。

现在,回答你的问题。当您运行编译器时,您提供要同时编译的完整文件集的路径:您编译一个模块,而不是单个文件。因此,它可以访问所有这些文件中的所有声明,并维护自己的有关可用类和顶级函数以及所有符号的数据结构。因此它可以仅使用 FQN 来存储和查找声明。 (免责声明:我不是专家,实际上我也不知道它在内部是如何完成的,但我只是猜测,从概念上讲,这就像在 FQN 和相应声明的信息之间存储一个大映射。)

如果您使用的声明不在正在编译的文件集中,则它必须位于您的某个依赖项中。。您可以通过指定包含已编译类的 jar 列表来告诉编译器可用的依赖项。编译时可用的所有类的列表称为编译类路径。这就是为什么您用来构建项目的工具(例如 Gradle 或您的 IDE)需要了解这些依赖项,以便在为您调用编译器时可以将它们的声明放在编译类路径上。然后,就像正在编译的声明一样,编译器可以轻松地查找编译类路径中的声明(路径已作为参数提供给编译器)。

现在,当您实际运行编译的程序时,至少在 JVM 上,所需的类必须放置在运行时类路径上 - 一组提供给java程序。在程序运行时查找这些声明是由类加载器完成的。有多个类加载器,按层次结构组织,但这里无需赘述。基本上,每次程序运行时第一次使用某个类时,都会要求一个类加载器将该类加载到内存中。类加载器有不同的实现,但最常见的实现之一是 URLClassLoader它给出了一些包含类的 jar 的 URL,并且知道如何按需将这些 jar 中的类读取到内存中。

关于kotlin - Kotlin中import如何找到文件路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73682826/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com