Module jdk.jshell
Package jdk.jshell

Class JShell

java.lang.Object
jdk.jshell.JShell
所有已实现的接口:
AutoCloseable

public class JShell extends Object implements AutoCloseable
JShell评估状态引擎。这是JShell API中的中心类。一个JShell实例保存着不断演变的编译和执行状态。状态通过实例方法eval(String)drop(Snippet)addToClasspath(String)来改变。大多数方法都是查询状态的。一个JShell实例还允许使用onSnippetEvent(Consumer)onShutdown(Consumer)注册事件,这些事件可以通过unsubscribe(Subscription)来取消注册。通过sourceCodeAnalysis()可以访问源代码分析工具。当完成时,实例应该关闭以释放资源 -- close()

使用JShell.create()创建一个JShell实例。

这个类不是线程安全的,除非另有说明,所有访问都应通过单个线程进行。

自JDK版本:
9
  • Method Details

    • create

      public static JShell create() throws IllegalStateException
      创建一个新的JShell状态引擎。也就是创建一个JShell实例。

      等同于JShell.builder().build()

      返回:
      一个JShell实例。
      抛出:
      IllegalStateException - 如果无法创建JShell实例。
    • builder

      public static JShell.Builder builder()
      JShell.Builder的工厂方法,用于创建JShell实例。使用JShell.builder().build()创建JShell的默认实例。有关更多构建选项,请参见JShell.Builder
      返回:
      一个Builder实例。
      参见:
    • sourceCodeAnalysis

      public SourceCodeAnalysis sourceCodeAnalysis()
      访问源代码分析功能。一个JShell实例将始终从sourceCodeAnalysis()返回相同的SourceCodeAnalysis实例。
      返回:
      一个可以用于源代码分析的SourceCodeAnalysis实例,例如完成检测和完成建议。
    • eval

      public List<SnippetEvent> eval(String input) throws IllegalStateException
      评估输入的字符串,包括定义和/或执行(如果适用)。检查输入是否有错误,除非错误可以推迟(如一些未解析的依赖项引用的情况),否则错误将中止评估。
      参数:
      input - 要评估的输入字符串
      返回:
      由此评估直接或间接引起的事件列表。
      抛出:
      IllegalStateException - 如果此JShell实例已关闭。
      参见:
    • drop

      public List<SnippetEvent> drop(Snippet snippet) throws IllegalStateException
      从状态中删除一个声明。也就是,如果片段是一个活动的持久片段,则删除该片段并相应地更新JShell评估状态。对于所有活动片段,将状态更改为DROPPED
      参数:
      snippet - 要删除的片段
      返回:
      从更新依赖于已删除片段的声明中产生的事件列表。
      抛出:
      IllegalStateException - 如果此JShell实例已关闭。
      IllegalArgumentException - 如果该片段与此JShell实例不相关。
    • addToClasspath

      public void addToClasspath(String path)
      指定的路径被添加到eval()中使用的类路径的末尾。请注意,未命名包在放置eval(String)代码的包中是不可访问的。
      参数:
      path - 要添加到类路径的路径。
      抛出:
      IllegalStateException - 如果此JShell实例已关闭。
    • stop

      public void stop()
      尝试停止当前正在运行的评估。当在eval(java.lang.String)方法正在运行并且正在执行用户代码时调用时,将尝试停止用户代码。请注意,通常需要从与运行eval方法的线程不同的线程中调用此方法。
    • close

      public void close()
      关闭此状态引擎。释放资源。当不再需要此状态引擎时应调用此方法。
      实现接口:
      close 在接口 AutoCloseable
    • snippets

      public Stream<Snippet> snippets()
      返回所有片段。
      返回:
      按id顺序返回所有当前片段的片段。
    • variables

      public Stream<VarSnippet> variables()
      返回活动变量片段。这个便利方法等同于过滤snippets()以获取status(snippet).isActive() && snippet.kind() == Kind.VARIABLE并转换为VarSnippet
      返回:
      活动声明的变量。
    • methods

      public Stream<MethodSnippet> methods()
      返回活动方法片段。这个便利方法等同于过滤snippets()以获取status(snippet).isActive() && snippet.kind() == Kind.METHOD并转换为MethodSnippet。
      返回:
      活动声明的方法。
    • types

      public Stream<TypeDeclSnippet> types()
      返回活动类型声明(类、接口、注解类型和枚举)片段。此便利方法等同于snippets()过滤status(snippet).isActive() && snippet.kind() == Kind.TYPE_DECL并转换为TypeDeclSnippet。
      返回:
      活动声明的类型声明。
    • imports

      public Stream<ImportSnippet> imports()
      返回活动导入片段。此便利方法等同于snippets()过滤status(snippet).isActive() && snippet.kind() == Kind.IMPORT并转换为ImportSnippet。
      返回:
      活动声明的导入声明。
    • status

      public Snippet.Status status(Snippet snippet)
      返回片段的状态。这是通过显式eval()调用或由依赖项触发的自动更新而更新的。
      参数:
      snippet - 要查找的Snippet
      返回:
      与此片段对应的状态
      抛出:
      IllegalStateException - 如果此JShell实例已关闭。
      IllegalArgumentException - 如果片段与此JShell实例不相关。
    • diagnostics

      public Stream<Diag> diagnostics(Snippet snippet)
      返回片段最近评估的诊断信息。评估可以是由于显式eval()调用或由依赖项触发的自动更新。
      参数:
      snippet - 要查找的Snippet
      返回:
      与此片段对应的诊断信息。这不包括在unresolvedDependencies()中报告的未解决依赖项引用。
      抛出:
      IllegalStateException - 如果此JShell实例已关闭。
      IllegalArgumentException - 如果片段与此JShell实例不相关。
    • unresolvedDependencies

      public Stream<String> unresolvedDependencies(DeclarationSnippet snippet)
      对于RECOVERABLE_DEFINEDRECOVERABLE_NOT_DEFINED声明,片段当前未解决依赖项的名称。当eval()或另一个片段的eval()drop()导致依赖项更新时,此方法的返回值可能会更改。
      参数:
      snippet - 要查找的声明Snippet
      返回:
      当前未解决依赖项的符号名称流。
      抛出:
      IllegalStateException - 如果此JShell实例已关闭。
      IllegalArgumentException - 如果片段与此JShell实例不相关。
    • varValue

      public String varValue(VarSnippet snippet) throws IllegalStateException
      获取变量的当前值。
      参数:
      snippet - 要查询其值的变量Snippet。
      返回:
      由snippet引用的变量的当前值。
      抛出:
      IllegalStateException - 如果此JShell实例已关闭。
      IllegalArgumentException - 如果片段与此JShell实例不相关。
      IllegalArgumentException - 如果变量的状态不是Snippet.Status.VALID
    • onSnippetEvent

      public JShell.Subscription onSnippetEvent(Consumer<SnippetEvent> listener) throws IllegalStateException
      注册回调以在片段状态更改时调用。每次调用都会添加一个新的订阅。
      参数:
      listener - 状态更改时执行的操作。
      返回:
      可用于取消订阅此订阅的令牌。
      抛出:
      IllegalStateException - 如果此JShell实例已关闭。
    • onShutdown

      public JShell.Subscription onShutdown(Consumer<JShell> listener) throws IllegalStateException
      注册回调以在此JShell实例终止时调用。这可能是因为客户端进程已结束(例如调用System.exit(0))或连接已关闭,如通过close()。每次调用都会添加一个新的订阅。
      参数:
      listener - 状态终止时执行的操作。
      返回:
      可用于取消订阅此订阅的令牌。
      抛出:
      IllegalStateException - 如果此JShell实例已关闭
    • unsubscribe

      public void unsubscribe(JShell.Subscription token)
      取消回调订阅。
      参数:
      token - 要取消订阅的订阅对应的令牌。