“核心技术Ⅱ:脚本、编译、注解处理”的版本间差异
跳到导航
跳到搜索
第124行: | 第124行: | ||
*: 在由该Bindings对象表示的作用域内获取或放置一个绑定。 | *: 在由该Bindings对象表示的作用域内获取或放置一个绑定。 | ||
=== | === 重定向输入/输出 === | ||
通过调用脚本上下文的“'''setReader'''”和“'''setWriter'''”方法来重定向脚本的标准输入和输出。<br/> | |||
例如, | |||
<syntaxhighlight lang="java"> | |||
StringWriter writer = new StringWriter(); | |||
engine.getContext().setWriter(new PrintWriter(writer, true)); | |||
</syntaxhighlight> | |||
* setReader和setWriter方法只会影响脚本引赘的标准输人和输出源; | |||
* Nashorn引擎没有标准输入源的概念,因此调用setReader没有任何效果。 | |||
==== 相关方法 ==== | |||
javax.script.ScriptEngine 6 | |||
* SeriptContext getContext() | |||
*: 获得该引擎的默认的脚本上下文。 | |||
javax.script.ScriptContext 6 | |||
* Reader getReader() | |||
* void setReader(Reader reader) | |||
* Writer getWriter() | |||
* void setWriter(Writer writer) | |||
* Writer getErrorWriter() | |||
* void setErrorWriter(Writer writer) | |||
*: 获取或设置用于输入的读入器或用于正常与错误输出的写出器。 | |||
=== 间用脚本的函数和方法 === | === 间用脚本的函数和方法 === | ||
=== 编译脚本 === | === 编译脚本 === |
2020年12月19日 (六) 18:35的版本
Java平台的脚本
脚本语言是一种通过在运行时解释程序文本,从而避免使用通常的“编辑/编译/链接/运行”循环的语言。脚本语言有许多优势:
- 便于快速变更,鼓励不断试验;
- 可以修改运行着的程序的行为;
- 支持程序用户的定制化;
但,大多数脚本语言都缺乏可以使编写复杂应用受益的特性,例如强类型、封装和模块化。
脚本API 可以在Java平台上实现将脚本语言和传统语言的优势相结合,它支待在Java程序中对用“JavaScript”、“Groovy”、“Ruby”,甚至是更奇异的诸如“Scheme”和“Haskell”等语言编写的脚本进行调用。
获取脚本引擎
脚本引擎是一个可以执行用某种特定语言编写的脚本的类库。 当虚拟机启动时, 它会发现可用的脚本引擎。
- 枚举这些引赘, 需要构造一个“ScriptEngineManager”,并调用“getEngineFactories”方法:
ScriptEngineManager manager = new ScriptEngineManager(); String language; if(args.length = 0) { System.out.println("Available factories: "); for(ScriptEngineFactory factory : manager.getEnginefactories()) System.out.println(factory.getEngineName()); language="nashorn"; } else 1anguage = args[0];
- 可以查询每个引擎工厂支持的“引擎名”、“MIME类型”和“文件扩展名”:
- 可以直接通过以上(“引擎名”、“MIME类型”和“文件扩展名”)来请求引擎:
final ScriptEngine engine = manager.getEngineByName(language); if(engine == null) { System.err.println("No engine for " + language); System.exit(1); }
- JavaSE 8 包含一个“Nashorn”版本,这是由Oracle开发的一个JavaScript解释器。
- 可以通过在类路径中提供必要的JAR文件来添加对更多语言的支持。
相关方法
javax.script.ScriptEngineManager 6
- List<ScriptEngineFactory> getEngineFactories()
- 获取所有发现的引擎工厂的列表。
- ScriptEngine getEngineByName(String name)
- ScriptEngine getEngineByExtension(String extension)
- ScriptEngine getEngi neByMimeType(Stri ng mi me Type)
- 获取给定名字、 脚本文件扩展名或M IM E 类型的脚本引擎。
javax.script.ScriptEngineFactory 6
- List<String> getNames()
- List<String> getExtensions()
- List<String> getMimeTypes()
- 获取该工厂所了解的名字、脚本文件扩展名和MIME类型。
脚本赋值与绑定
通过引擎调用脚本:【“eval”?“evaluate”:评估、评价】
// 直接调用 Object result = engine.eval(scriptString); // 调用文件中的脚本,先打开一个Reader Object result = engine.eval(reader);
- 可以在同一个引擎上调用多个脚本。
- 判断在多个线程中并发执行脚本是否安全,调用:
Object param = factory.getParameter("THREADING");
- 返回值:
- “null”:并发执行不安全;
- “MULTITHREADED”:并发执行安全。一个线程的执行效果对另外的线程有可能是可视的;
- “THREAD-ISOLATED”:除了“MULTITHREADED”之外,会为每个线程维护不同的变量绑定;
- “STATELESS”:除了“THREAD-ISOLATED”之外,脚本不会改变变量绑定;
变量绑定:
- 脚本代码从“引擎作用域”中的绑定里读取k的定义:
- (大多数脚本语言都可以访问Java对象)
// 绑定变量到脚本: engine.put("b", new JButton()); engine.eval("b.text = 'Ok'"); // 获取由脚本语句绑定的变量: engine.eval("n = 1728"); Object result = engine.get("n");
- 除了引擎作用域之外,还有“全局作用域”。
- (任何添加到“ScriptEngineManager”中的绑定对所有引擎都是可视的)
- 将绑定收集到一个类型为“Bindings”的对象中,然后将其传递给“eval”方法:
- (绑定集不能持久化)
Bindings scope = engine.createBindings(); scope.put("b", new JButton()); engine.eval(scriptString, scope);
- 其他作用域:除了引擎作用域和全局作用域之外,还有需要其他的作用域:
- 需要实现一个类,它实现了“ScriptContext”接口,并管理着一个作用域集合。每个作用域都是由一个整数标识的,而且越小的数宇应该越先被搜索。
- (标准类库提供了“SimpleScriptContext”类,但是它只能持有全局作用域和引挛作用域)
相关方法
javax.scrlpt.ScriptEngine 6
- Object eval(String script)
- Object eval(Reader reader)
- Object eval(String script, Bindings bindings)
- Object eval(Reader reader, Bindings bindings)
- 对(由字符串或读取器给定的)脚本赋值,并服从给定的绑定。
- Object get(String key)
- void put(String key, Object value)
- 在引擎作用域内获取或放置一个绑定。
- Bindings createBindings()
- 创建一个适合该引擎的空Bindings对象。
javax.script.ScriptEngineManager 6
- Object get(String key)
- void put(String key, Object value)
- 在全局作用域内获取或放置一个绑定。
javax.script.Bindings 6
- Object get(String key)
- void put(String key, Object value)
- 在由该Bindings对象表示的作用域内获取或放置一个绑定。
重定向输入/输出
通过调用脚本上下文的“setReader”和“setWriter”方法来重定向脚本的标准输入和输出。
例如,
StringWriter writer = new StringWriter();
engine.getContext().setWriter(new PrintWriter(writer, true));
- setReader和setWriter方法只会影响脚本引赘的标准输人和输出源;
- Nashorn引擎没有标准输入源的概念,因此调用setReader没有任何效果。
相关方法
javax.script.ScriptEngine 6
- SeriptContext getContext()
- 获得该引擎的默认的脚本上下文。
javax.script.ScriptContext 6
- Reader getReader()
- void setReader(Reader reader)
- Writer getWriter()
- void setWriter(Writer writer)
- Writer getErrorWriter()
- void setErrorWriter(Writer writer)
- 获取或设置用于输入的读入器或用于正常与错误输出的写出器。