查看“核心技术Ⅱ:脚本、编译、注解处理”的源代码
←
核心技术Ⅱ:脚本、编译、注解处理
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:JavaCore]] == Java平台的脚本 == 脚本语言是一种通过在运行时解释程序文本,从而避免使用通常的“编辑/编译/链接/运行”循环的语言。脚本语言有许多优势: # 便于快速变更,鼓励不断试验; # 可以修改运行着的程序的行为; # 支持程序用户的定制化; <br/> 但,大多数脚本语言都缺乏可以使编写复杂应用受益的特性,例如强类型、封装和模块化。 <br/> 脚本API 可以在Java平台上实现将脚本语言和传统语言的优势相结合,它支待在Java程序中对用“JavaScript”、“Groovy”、“Ruby”,甚至是更奇异的诸如“Scheme”和“Haskell”等语言编写的脚本进行调用。 === 获取脚本引擎 === <pre> 脚本引擎是一个可以执行用某种特定语言编写的脚本的类库。 当虚拟机启动时, 它会发现可用的脚本引擎。 </pre> # 枚举这些引赘, 需要构造一个“'''ScriptEngineManager'''”,并调用“'''getEngineFactories'''”方法: #: <syntaxhighlight lang="java"> 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]; </syntaxhighlight> #: 可以查询每个引擎工厂支持的“引擎名”、“MIME类型”和“文件扩展名”: #: [[File:脚本引擎工厂的属性.png|600px]] # 可以直接通过以上(“引擎名”、“MIME类型”和“文件扩展名”)来请求引擎: #: <syntaxhighlight lang="java"> final ScriptEngine engine = manager.getEngineByName(language); if(engine == null) { System.err.println("No engine for " + language); System.exit(1); } </syntaxhighlight> * 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”:评估、评价】 : <syntaxhighlight lang="java"> // 直接调用 Object result = engine.eval(scriptString); // 调用文件中的脚本,先打开一个Reader Object result = engine.eval(reader); </syntaxhighlight> * 可以在同一个引擎上调用多个脚本。 * 判断在多个线程中并发执行脚本是否安全,调用: *: <syntaxhighlight lang="java"> Object param = factory.getParameter("THREADING"); </syntaxhighlight> *: 返回值: *# “null”:并发执行不安全; *# “MULTITHREADED”:并发执行安全。一个线程的执行效果对另外的线程有可能是可视的; *# “THREAD-ISOLATED”:除了“MULTITHREADED”之外,会为每个线程维护不同的变量绑定; *# “STATELESS”:除了“THREAD-ISOLATED”之外,脚本不会改变变量绑定; 变量绑定: # 脚本代码从“'''引擎作用域'''”中的绑定里读取k的定义: #*(大多数脚本语言都可以访问Java对象) #: <syntaxhighlight lang="java"> // 绑定变量到脚本: engine.put("b", new JButton()); engine.eval("b.text = 'Ok'"); // 获取由脚本语句绑定的变量: engine.eval("n = 1728"); Object result = engine.get("n"); </syntaxhighlight> # 除了引擎作用域之外,还有“'''全局作用域'''”。 #*(任何添加到“'''ScriptEngineManager'''”中的绑定对所有引擎都是可视的) # 将绑定收集到一个类型为“'''Bindings'''”的对象中,然后将其传递给“eval”方法: #*(绑定集不能持久化) #: <syntaxhighlight lang="java"> Bindings scope = engine.createBindings(); scope.put("b", new JButton()); engine.eval(scriptString, scope); </syntaxhighlight> # 其他作用域:除了引擎作用域和全局作用域之外,还有需要其他的作用域: #: 需要实现一个类,它实现了“'''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对象表示的作用域内获取或放置一个绑定。 === 重定向输入和输出 === === 间用脚本的函数和方法 === === 编译脚本 === == 编译器API == === 编译便捷之法 === === 使用编译工具 === === 一个示例:动态Java 代码生成 === == 使用注解 == === 注解简介 === === 一个示例:注解事件处理器 === == 注解语法 == === 注解接口 === === 注解 === === 注解各类声明 === === 注解类型用法 === === 注解this === == 标准注解 == === 用于编译的注解 === === 用于管理资源的注解 === === 元注解 === == 源码级注解处理 == === 注解处理 === === 语言模型API === === 使用注解来生成源码 === == 字节码工程 == === 修改类文件 === === 在加载时修改字节码 ===
返回至“
核心技术Ⅱ:脚本、编译、注解处理
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息