将 Package-Private 类 导入 JShell

Importing Package-Private Classes to JShell

在 Java 9 发布后,我一直在玩 JShell,我尝试导入我制作的包。由于我为其编码的整个应用程序将包含在该包中,因此每个 class 除了一个(我还没有编码)都是包私有的。我的 class 路径是正确的,但我仍然无法在 JShell 中使用包中声明的任何类型(它会引发 "cannot find symbol" 错误)。 我是否需要让它们 public 才能访问它们,或者有什么方法可以测试 package-private classes?这是我试过的确切代码。

我的当前目录是

C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\src

我的 class 路径是

C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\cls

包目录(用于字节码)是

C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\cls\collatz

CollatzSequence 是包含在 collatz.[= 中的包私有 class 17=]

PS C:\Users\Sylvaenn> cd OneDrive\Documents\Programs\Java\src
PS C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\src> jshell
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro

jshell> import collatz.*;

jshell> CollatzSequence seq = new CollatzSequence(BigInteger.ONE);
|  Error:
|  cannot find symbol
|    symbol:   class CollatzSequence
|  CollatzSequence seq = new CollatzSequence(BigInteger.ONE);
|  ^-------------^
|  Error:
|  cannot find symbol
|    symbol:   class CollatzSequence
|  CollatzSequence seq = new CollatzSequence(BigInteger.ONE);
|                            ^-------------^

jshell> /imports
|    import java.io.*
|    import java.math.*
|    import java.net.*
|    import java.nio.file.*
|    import java.util.*
|    import java.util.concurrent.*
|    import java.util.function.*
|    import java.util.prefs.*
|    import java.util.regex.*
|    import java.util.stream.*
|    import collatz.*

jshell>

据我所知(如果我错了请纠正我),你不能使用 JShell (类 在特定包 中创建 Class 在 JShell 中创建的总是在默认包中。

也就是说,您无法从 JShell 中访问您的包私有 类。这是 "normal" Java 行为。

来自 JEP#220 - The Java Shell (Read-Eval-Print Loop)

A snippet may not declare a package or a module. All JShell code is placed in a single package in an unnamed module. The name of the package is controlled by JShell.

这可能就是您无法在 JShell 中声明 package 的原因。


正如 tool documentation 所建议的,尽管您可以尝试一下:-

The default startup script consists of several common imports. You can personalize your startup entries with the /set start command.

你可以在 class 的 set the classpath or the modulepath 中使用 :

jshell --class-path C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\cls