Доступ JShell к переменным, определенным вне экземпляра jshell - PullRequest
0 голосов
/ 02 марта 2019

Изнутри скрипта jShell можно получить доступ или зарегистрировать переменные, которые определены в коде, который также создает JShell?

В настоящее время, похоже, не существует механизма для доступа или регистрации переменной в экземпляре Shell,или не возвращает ни одного строкового типа изнутри JShell (например, объекты или лямбда и т. д.)

ex:


    import jdk.jshell.JShell;
    import jdk.jshell.JShellException;
    import jdk.jshell.SnippetEvent;

    import java.util.List;


    public class Main {

        public static void main(String[] args) throws JShellException {
            var localVar = 1;
            JShell shell = JShell.create();
            // How to register localVar variable with shell instance or access variables from scope
            List events = shell.eval("var x = localVar;");
            SnippetEvent event = events.get(0);
            System.out.println("Kind: " + event.snippet().kind() + ", Value: " + event.value());
        }

    }

1 Ответ

0 голосов
/ 02 марта 2019

Хотя вы не можете получить доступ к локальным именам, как в вашем примере, вы можете создать экземпляр JShell, который будет выполняться в той же JVM, которая его создала.Для этого вы бы использовали LocalExecutionControl.Используя этот элемент управления выполнением, вы можете переместить localVar в статическое поле в вашем классе Main, а затем получить к нему доступ "изнутри" кода JShell с помощью Main.localVar.

К сожалению, поскольку API предназначен для поддержкипоставщики выполнения, которые могут находиться в другом процессе или даже на другом компьютере, тип возвращаемого значения - строка.Если вы заинтересованы во взломе, ядру IJava jupyter потребовалась реализация eval, возвращающая Object, которая в итоге использовала реализацию ExecutionControl на основе DirectExecutionControl, в которой был сохранен результат evalпозвонить в карту и вернул уникальный идентификатор для ссылки на этот результат.Затем, используя оболочку, вам придется искать результат по идентификатору, возвращенному eval (придумайте что-то вроде results.get(eval(sourceCode))).Эта реализация на github в IJavaExecutionControl.java и IJavaExecutionControlProvider.java с примером использования в CodeEvaluator.java # L72 , если вы заинтересованы в принятии любого из них(Лицензия MIT).

...