将 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
在 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