- 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
-
-
嵌套类汇总
嵌套类 变量和类型 类 描述 static class
JShell.Builder
生成器用于JShell
实例。class
JShell.Subscription
订阅是用于引用订阅的令牌,因此它们可以是 unsubscribed 。
-
方法摘要
-
-
-
方法详细信息
-
create
public static JShell create() throws IllegalStateException
- 结果
-
JShell
一个实例。 - 异常
-
IllegalStateException
- 如果无法创建JShell
实例。
-
builder
public static JShell.Builder builder()
JShell.Builder
工厂方法,用于创建JShell
实例。 创建的默认实例JShell
与JShell.builder().build()
。 有关更多施工选项,请参阅JShell.Builder
。- 结果
-
Builder
一个实例。 - 另请参见:
-
JShell.Builder
-
sourceCodeAnalysis
public SourceCodeAnalysis sourceCodeAnalysis()
访问源代码分析功能。JShell
的实例将始终从sourceCodeAnalysis()
返回相同的SourceCodeAnalysis
实例。- 结果
-
SourceCodeAnalysis
的一个实例,可用于源分析,例如完成检测和完成建议。
-
eval
public List<SnippetEvent> eval(String input) throws IllegalStateException
评估输入字符串,包括定义和/或执行(如果适用)。 检查输入是否有错误,除非可以延迟错误(如某些unresolvedDependencies引用的情况),错误将中止评估。输入应该只是一个完整的源代码片段,即一个表达式,语句,变量声明,方法声明,类声明或导入。 要将任意输入分解为单个完整代码段,请使用
SourceCodeAnalysis.analyzeCompletion(String)
。对于导入,添加导入。 类,接口。 方法和变量是定义的。 执行变量,语句和表达式的初始化程序。 修饰符public,protected,private,static和final在op级声明中是不允许的,并且会被警告忽略。 不允许使用同步,本机,抽象和默认的顶级方法,这些方法都是错误的。 如果覆盖了声明的先前定义,则会有一个事件显示其状态已更改为OVERWRITTEN,这对于删除,拒绝或已经覆盖的声明不会发生。
如果执行环境不在进程中(默认情况下),那么如果评估的代码导致执行环境终止,则此
JShell
实例将关闭,但调用进程和VM仍然有效。- 参数
-
input
- 要评估的输入String - 结果
- 此评估直接或间接导致的事件列表。
- 异常
-
IllegalStateException
- 如果此JShell
实例已关闭。 - 另请参见:
-
SourceCodeAnalysis.analyzeCompletion(String)
,onShutdown(java.util.function.Consumer)
-
drop
public List<SnippetEvent> drop(Snippet snippet) throws IllegalStateException
- 参数
-
snippet
- 要删除的代码段 - 结果
- 更新声明的事件列表取决于已删除的代码段。
- 异常
-
IllegalStateException
- 如果此JShell
实例已关闭。 -
IllegalArgumentException
- 如果该代码段与此JShell
实例JShell
。
-
addToClasspath
public void addToClasspath(String path)
指定的路径将添加到eval()中使用的类路径的末尾。 请注意,无法从放置eval(String)
代码的程序包访问未命名的程序包。- 参数
-
path
- 要添加到类路径的路径。 - 异常
-
IllegalStateException
- 如果此JShell
实例已关闭。
-
stop
public void stop()
尝试停止当前正在运行的评估。 在eval(java.lang.String)
方法运行且正在执行用户代码时调用时,将尝试停止用户代码。 请注意,通常需要从与运行eval
方法的线程不同的线程调用eval
方法。如果
eval(java.lang.String)
方法未运行,则不执行任何操作。在某些情况下,尝试停止用户代码可能会失败,这可能包括在I / O操作上阻止执行时,或者当用户代码捕获
ThreadDeath
异常时。
-
close
public void close()
关闭此状态引擎。 释放资源。 应该在不再需要此状态引擎时调用。- Specified by:
-
close
在界面AutoCloseable
-
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
实例JShell
。
-
diagnostics
public Stream<Diag> diagnostics(Snippet snippet)
返回最新评估片段的诊断信息。 评估可以是因为显式调用eval()
或依赖项触发的自动更新。- 参数
-
snippet
- 查询Snippet
- 结果
-
与此代码段对应的诊断程序。
这不包括
unresolvedDependencies()
报告的unresolvedDependencies引用。 - 异常
-
IllegalStateException
- 如果此JShell
实例已关闭。 -
IllegalArgumentException
- 如果该代码段与此JShell
实例JShell
。
-
unresolvedDependencies
public Stream<String> unresolvedDependencies(DeclarationSnippet snippet)
对于RECOVERABLE_DEFINED
或RECOVERABLE_NOT_DEFINED
声明,代码段的当前未解析依赖项的名称。 对于给定方法,此方法的返回值可能会在另一个代码段的eval()
或drop()
导致更新依赖项时发生更改。- 参数
-
snippet
- 查询声明Snippet
- 结果
- 当前未解析的符号名称流。
- 异常
-
IllegalStateException
- 如果此JShell
实例已关闭。 -
IllegalArgumentException
- 如果该代码段与此JShell
实例JShell
。
-
varValue
public String varValue(VarSnippet snippet) throws IllegalStateException
获取变量的当前值。- 参数
-
snippet
- 查询其值的变量Snippet。 - 结果
- 片段引用的变量的当前值。
- 异常
-
IllegalStateException
- 如果此JShell
实例已关闭。 -
IllegalArgumentException
- 如果该代码段与此JShell
实例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
- 与要取消订阅的订阅对应的令牌。
-
-