Импорт закрытых для пакета классов в 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