模块 jdk.jshell

类 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 的一个实例是用 JShell.create() 创建的。

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

自从:
9
  • 方法详情

    • 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
      评估输入字符串,包括定义和/或执行(如果适用)。检查输入是否有错误,除非可以延迟错误(如某些未解决的依赖项引用的情况),否则错误将中止评估。

      输入应该是一个完整的源代码片段,即一个表达式、语句、变量声明、方法声明、类声明或导入。要将任意输入分解为单独的完整片段,请使用 SourceCodeAnalysis.analyzeCompletion(String)

      对于导入,添加导入。类,接口。定义了方法和变量。执行变量、语句和表达式的初始化程序。修饰符 public、protected、private、static 和 final 不允许在 op-level 声明中使用,并且会被忽略并发出警告。同步的、本机的、抽象的和默认的顶级方法是不允许的,都是错误的。如果声明的先前定义被重写,则会有一个事件显示其状态更改为 OVERWRITTEN,这不会发生在丢弃、拒绝或已经重写的声明中。

      如果执行环境在进程外,这是默认情况,那么如果评估的代码导致执行环境终止,则此 JShell 实例将关闭,但调用进程和 VM 仍然有效。

      参数:
      input - 要评估的输入字符串
      返回:
      本次评价直接或间接引起的事件清单。
      抛出:
      IllegalStateException - 如果此 JShell 实例已关闭。
      参见:
    • drop

      public List <SnippetEvent > drop(Snippet  snippet) throws IllegalStateException
      从状态中删除声明。也就是说,如果该片段是 active persistent 片段,则删除该片段并相应地更新 JShell 评估状态。对于所有活动片段,将 status 更改为 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 方法的线程不同的线程调用此方法。

      如果 eval(java.lang.String) 方法未运行,则不执行任何操作。

      在某些情况下,停止用户代码的尝试可能会失败,这可能包括在 I/O 操作上阻塞执行时,或者当用户代码正在捕获 ThreadDeath 异常时。

    • 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() 中报告的 unresolvedDependencies 引用。
      抛出:
      IllegalStateException - 如果此 JShell 实例已关闭。
      IllegalArgumentException - 如果片段与此 JShell 实例无关。
    • unresolvedDependencies

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

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

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

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

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