将包私有类导入到JShell中
在Java 9发布后,我正在使用JShell,并尝试导入我制作的包。由于我为它编写的整个应用程序将包含在该包中,除了一个类(我还没有编码),每个类都是包私有的。我的类路径是正确的,但我仍然无法使用JShell包中声明的任何类型(它会引发“无法找到符号”错误)。 我是否需要让它们公开才能使用它们,或者有什么方法可以测试包私有类?这是我尝试的确切代码。将包私有类导入到JShell中
我的当前目录是
C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\src
我的类路径是
C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\cls
和封装目录(字节码)是
C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\cls\collatz
CollatzSequence
是套餐的包含在中的私人课程。
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创建一个类(内JShell创建的课总是默认包)。
这就是说,你不能从JShell中访问你的包私有类。这是“正常”的Java行为。
关于在特定的包中创建类,我无法找到一种方法来使用JShell命令,否则它是有道理的,你将无法这样做,但我不知道肯定。而且我认为无法访问包私有类也是有意义的,但这是一个巨大的失望。 –
从JEP#220 - The Java Shell (Read-Eval-Print Loop)
一个片段可能不声明一个包或模块。所有JShell代码是 放置在一个未命名模块的单个包中。该软件包的名称由JShell控制。
这就是为什么您无法在JShell中声明package
的原因。
由于tool documentation建议虽然你可以试试这个: -
默认的启动脚本是由几种常见的进口。您可以使用
/set
start命令来个性化启动条目。
在那里你可以set the classpath或者你会使用的类the modulepath:
jshell --class-path C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\cls
非常有用的信息,但我没有试图声明一个新的包;我试图访问现有的包私有类。我的班级路径已经指向了正确的目录,但我会尝试在shell中明确地设置它。但是,我认为接受的答案是正确的。 JShell只能访问公共类。 –
能否请您分享的情况下可重复的代码?这将有助于明确问题。 – nullpointer
我只是将它包含在我的编辑中。 –