Java编译器如何知道我创建的包在哪里?

wfauudbj  于 2023-01-04  发布在  Java
关注(0)|答案(2)|浏览(118)

我想知道是否有任何方法可以让我们使用相对路径导入类中的包。
要设置一个类比,在html中可以使用相对路径来设置超链接。
例如,给定以下文件结构:

Folder: "A"
          |
          |____________ Folder: "B"
          |            |
          |            |
          |            |
          |            |_________  File html: "Link.html"
          | 
          |   
          |
          |________ File html: "Index.html"

因此,在文件"Link.html"中,我可以设置这个超链接:

<!DOCTYPE html>
<html>
      <head>
           <title>Link</title>
      </head>
      <body>
           <main>
             <h1>You are in the file "Link"</h1>

               <!--This would be the hyperlink-->
               <a href="../Index.html"> Go to Index </a>

          </main>
      </body>
</html>

我的问题是:我可以创建一个包,例如在文件夹"B"中,然后从文件夹"B"中导入类到文件夹"A"中吗?我的意思是不使用"classpath"(我没有说不使用"sourcepath",因为我不确定它是如何工作的)。

Folder: "A"
          |
          |____________ Folder: "B"
          |            |
          |            |
          |            |
          |            |_________  File Java: "Example.java"
          | 
          |   
          |
          |________ File Java: "Main.Java"

此外,我可以直接在java文件中设置一个绝对路径来导入一个包,而不必通过类路径手动告诉编译器包在哪里吗?(就像html一样?)
我的意思是类似于这个例子,但当导入一个包在java:

<a href="C:\Users\Pc2\Desktop\A\Index.html"> Go to Index </a>

提前致谢;)

hfyxw5xn

hfyxw5xn1#

我想知道是否有任何方法可以让我们使用相对路径导入类中的包。
不支持。Java不支持。包名在定义时是完全限定的,在使用时也是完全限定的。
我的问题是:我可以创建一个包,例如在文件夹"B"中,并从文件夹"B"导入类到一个java文件中,该文件将位于文件夹"A"中?
对于OpenJDKJava工具链,以及其他任何使用相同类解析机制的工具1,文件夹名称结构必须Map到包结构,因此假设A上面的文件夹是(源代码或二进制)类文件夹树的根,那么Main.java文件需要package声明

package A;

并且您的Example.java文件需要一个package声明:

package A.B;

(Note这种情况很重要,包名AB违反了Java风格。)
Example可以导入Main,反之亦然,但是它们必须使用完全限定的包名来完成;即

import A.Main;
import A.B.Example;

问:你可以通过一个不对应于文件/文件夹结构的类/包命名方案来欺骗编译器/运行时吗?
答:不会。Java编译器或运行时将无法找到类,或者它将检测到类的完全限定符与找到它的位置不匹配。在这两种情况下,您都会得到一个错误。
问:你可以导入文件路径名?
答:不,Java语言不允许这样做。只是......不。
我的意思是不使用"classpath"(我没有说也不使用"sourcepath",因为我不确定它是如何工作的)。
这是没有意义的。你不能"不使用"类路径。如果没有类路径,Java工具就找不到你的代码。类路径总是存在的......即使它只是当前目录;即"."。
1-据我所知,这涵盖了当前所有实际的Java实现。然而,Java实现在技术上可能(并且被Java语言规范所允许)使用一些其他机制来组织和定位源代码或二进制代码"实体"。

iqih9akk

iqih9akk2#

对于您的第一个问题:Java包就是这样做的,但是CLASSPATH仍然在使用。默认的类加载器将在CLASSPATH下查找类,并期望它们基于包名定位。(还有其他的类加载器有不同的行为,但是大多数情况下您将使用默认的。)
关于你的第二个问题:不,你不能。如上所述,默认的类加载器将在CLASSPATH下查找你导入的任何类,并将尝试根据类的包名来定位。(同样,假设你使用默认的类加载器。)
Java包是构建代码的标准方式,并且在大多数情况下,这种结构也会复制到文件系统上(对于源文件和类文件)。

相关问题