Импорт закрытых для пакета классов в JShell

Я начал играть с JShell после выпуска Java 9 и попытался импортировать пакет, который сделал. Поскольку все приложение, для которого я его кодирую, будет содержаться в этом пакете, каждый класс, кроме одного (который я еще не кодировал), является частным для пакета. Мой путь к классам правильный, но я все еще не могу использовать ни один из типов, объявленных в пакете в 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 это пакетный класс, содержащийся в collatz ,

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>

2 ответа

Решение

Насколько я знаю (поправьте меня, если я ошибаюсь), вы не можете создать класс в определенном пакете, используя JShell (классы, созданные в JShell, всегда находятся в пакете по умолчанию).

При этом вы не можете получить доступ к своим закрытым пакетам классам из JShell. Это "нормальное" поведение Java.

От JEP#220 - Оболочка Java (Цикл Read-Eval-Print)

Фрагмент не может объявлять пакет или модуль. Весь код JShell помещается в один пакет в неназванном модуле. Имя пакета контролируется JShell.

Вероятно, поэтому вы не можете объявить package в JShell.


Как видно из документации по инструменту, вы можете попробовать это:-

Скрипт запуска по умолчанию состоит из нескольких общих импортов. Вы можете персонализировать свои записи запуска с помощью /set команда запуска.

где вы можете установить classpath или modulepath класса, который вы бы использовали:

jshell --class-path C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\cls
Другие вопросы по тегам