Java中使用脚本语言
Java脚本语言概述
Java语言对脚本语言的支持都抽象在javax.script包中,并且实现规范为JSR223。从上图的类关系图中,我们知道整体抽象比较简单,下面我们就来详细分析一下Java对脚本语言的支持。
ScriptEngine
ScriptEngine是一个基本接口,在规范中要求,每个实现都必须全部实现该接口的方法。
主要包括执行脚步的方法和对值的获取和设置方法。
public interface ScriptEngine {
public static final String ARGV="javax.script.argv";
public static final String FILENAME = "javax.script.filename";
public static final String ENGINE = "javax.script.engine";
public static final String ENGINE_VERSION = "javax.script.engine_version";
public static final String NAME = "javax.script.name";
public static final String LANGUAGE = "javax.script.language";
public static final String LANGUAGE_VERSION ="javax.script.language_version";
public Object eval(String script, ScriptContext context) throws ScriptException;
public Object eval(Reader reader , ScriptContext context) throws ScriptException;
public Object eval(String script) throws ScriptException;
public Object eval(Reader reader) throws ScriptException;
public Object eval(String script, Bindings n) throws ScriptException;
public Object eval(Reader reader , Bindings n) throws ScriptException;
public void put(String key, Object value);
public Object get(String key);
public Bindings getBindings(int scope);
public void setBindings(Bindings bindings, int scope);
public Bindings createBindings();
public ScriptContext getContext();
public void setContext(ScriptContext context);
public ScriptEngineFactory getFactory();
}
ScriptEngineManager
ScriptEngineManager实现了ScriptEngine类的发现和实例化机制,还维护了一个键/值对集合,存储由Manager创建的所有引擎共享的状态。该类使用服务提供程序机制枚举ScriptEngineFactory的所有实现。
ScriptEngineManager提供了一个方法来返回所有这些工厂的列表,以及根据语言名称、文件扩展名和mime类型查找工厂的实用方法。
由管理器维护的键/值对绑定称为“全局作用域”,对ScriptEngineManager创建的ScriptEngine的所有实例都可用。绑定中的值通常在所有脚本中公开。
ScriptEngineFactory
ScriptEngineFactory用于描述和实例化ScriptEngines。
每个实现ScriptEngine的类都有一个相应的工厂,该工厂公开描述引擎类的元数据。
ScriptEngineManager使用Jar文件规范中描述的服务提供程序机制来获取当前ClassLoader中可用的所有ScriptEngineFactories的实例。
ScriptContext
该接口的实现类用于在托管应用程序中将脚本引擎与对象(如作用域绑定)连接起来。每个作用域都是一组已命名的属性,可以使用ScriptContext方法设置和检索这些属性的值。ScriptContexts还公开了可由ScriptEngines用于输入和输出的reader和writer。
CompiledScript
由存储编译结果的类扩展。状态可以以Java类、Java类文件或脚本语言操作码的形式存储。脚本可以重复执行而不需要重新解析。
每个CompiledScript都与一个ScriptEngine相关联——调用CompiledScript的eval方法会导致ScriptEngine执行脚本。由CompiledScript的执行引起的ScriptEngine状态的变化可以在引擎后续执行脚本时看到。
Compilable
ScriptEngines实现的可选接口,它的方法将脚本编译为可以重复执行而无需重新编译的表单。
Invocable
由ScriptEngines实现的可选接口,其方法允许调用之前执行过的脚本中的过程。
Bindings
键/值对的映射,所有键都是string类型的。