Очень полезная информация, но я не пытаюсь объявить новый пакет; Я пытаюсь получить доступ к закрытым пакетным классам в существующем. Мой путь к классу уже указывает на правильный каталог, но я попытаюсь явно установить его в оболочке. Тем не менее, я думаю, что принятый ответ правильный; только открытые классы доступны для 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>
 Isaac Saffold25 сент. 2017 г., 20:14
Я просто включил его в мою правку.
 Naman24 сент. 2017 г., 21:17
Не могли бы вы поделиться воспроизводимым кодом для этого сценария? Это поможет прояснить вопрос.

Ответы на вопрос(2)

Оболочка Java (цикл чтения-проверки-печати)

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

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

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

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

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

jshell --class-path C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\cls
 Isaac Saffold26 сент. 2017 г., 00:22
Очень полезная информация, но я не пытаюсь объявить новый пакет; Я пытаюсь получить доступ к закрытым пакетным классам в существующем. Мой путь к классу уже указывает на правильный каталог, но я попытаюсь явно установить его в оболочке. Тем не менее, я думаю, что принятый ответ правильный; только открытые классы доступны для JShell.
Решение Вопроса

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

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

 Isaac Saffold25 сент. 2017 г., 20:22
Что касается создания класса в определенном пакете, я не смог найти способ сделать это с помощью команд JShell, и в противном случае имеет смысл, что вы не сможете этого сделать, но я точно не знаю. И я полагаю, что невозможность доступа к закрытым пакетам имеет смысл, но это большое разочарование.

Ваш ответ на вопрос