java平台脚本+java编译器API
【0】README
0.1)本文文字描述转自 core java volume 2, 旨在学习 java平台脚本+java编译器API 的 基础知识;
------------------------------------------------------------------------------
【1】java平台的脚本
【1.1】获取脚本引擎
![](/assets/blank.gif)
<span style="font-family:Microsoft YaHei;font-size:14px;">ScriptEngine engine = manager.getEngineByName("JavaScript");</span>
【1.2】 脚本赋值与绑定
<span style="font-family:Microsoft YaHei;font-size:14px;">engine.eval("n=1728");
Object result = engine.eval("n+1")
返回 1729;</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">engine.put(k, 100);
Object result = engine.eval("k+1");</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">engine.eval("n=100");
Object result = engine.get("n");</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">Bindings scope = engine.createBindings();
scope.put(b, new Butten());
engine.eval(script, scope);</span>
![](/assets/blank.gif)
<span style="font-family:Microsoft YaHei;font-size:14px;">package com.corejava.chapter10;import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.List;import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;public class ScriptTest
{public static void main(String[] args) throws ScriptException, FileNotFoundException{// 脚本引擎管理器//ScriptEngineManager manager = new ScriptEngineManager();/*List<ScriptEngineFactory> list = manager.getEngineFactories();for(ScriptEngineFactory engine : list){System.out.println(engine.getEngineName());}*/// 脚本引擎管理器ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("JavaScript");// 向引擎中添加变量绑定engine.eval("n=1728");Object result = engine.eval("n+1"); // 1729.0System.out.println(result);// 获取由脚本语句绑定的变量 engine.put("k", 100);result = engine.eval("k+1"); // 101System.out.println(result);// 除了向引擎或全局作用域添加绑定外,还可以将绑定收集到一个类型为 Bindings 的对象中, // 然后将其传递给 eval 方法:Bindings scope = engine.createBindings();scope.put("a", "hello, ");result = engine.eval("a+ 'world!'", scope); // hello, world!System.out.println(result);// 重定向输入和输出// 任何用 js 的 print 和 println函数产生的输出都会发送到 writerStringWriter writer = new StringWriter();engine.getContext().setWriter(new PrintWriter(new File("com/corejava/chapter10/output.txt")));engine.eval("print('hello world, this msg is from java app')");}
}</span>
【1.3】重定向输入和输出
<span style="font-family:Microsoft YaHei;font-size:14px;">StringWriter writer = new StringWriter();
engine.getContext().setWriter(new PrintWriter(writer, true));</span>
![](/assets/blank.gif)
<span style="font-family:Microsoft YaHei;font-size:14px;">// 重定向输入和输出(同上)// 任何用 js 的 print 和 println函数产生的输出都会发送到 writerStringWriter writer = new StringWriter();engine.getContext().setWriter(new PrintWriter(new File("com/corejava/chapter10/output.txt")));engine.eval("print('hello world, this msg is from java app')");</span>
【1.4】调用脚本的函数和方法
<span style="font-family:Microsoft YaHei;font-size:14px;">if(engine implemens Invocable)(Invocable)engine.invockFunction("aFunction", param1, param2);</span>
<span style="font-family:Microsoft YaHei;font-size:14px;"> (Invocable)engine.invockMethod(implicitParam, "aMethod", explicitParam1, explicitParam2);</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">public interface Greeter
{String greet(String whom);
}</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">function greet(x)
{return "hello" + x + "!";
}</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">Greeter g = ((Invocable)engine).getInterface(Greeter.class);</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">String result = g.greet("world");</span>
![](/assets/blank.gif)
<span style="font-family:Microsoft YaHei;font-size:14px;">public class InvocableTest
{public static void main(String[] args) throws FileNotFoundException, ScriptException{// 脚本引擎管理器ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("JavaScript");engine.eval(new FileReader("com/corejava/chapter10/test.js"));Greeter g = ((Invocable)engine).getInterface(Greeter.class);String result = g.greet("World");System.out.println(result);// hello, World}
}</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">function SimpleGreeter(salutation) {this.salutation = salutation};
SimpleGreeter.prototype.greet = function(whom){return this.salutation + ", " + whom + "!" ;}</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">Object greeter = engine.eval("new SimpleGreenter('goodbye')");
Greeter g = ((Invocable)engine).getInterface(greeter , Greeter.class);</span>
![](/assets/blank.gif)
<span style="font-family:Microsoft YaHei;font-size:14px;">public class SimpleGreeter
{public static void main(String[] args) throws FileNotFoundException, ScriptException{// 脚本引擎管理器ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("JavaScript");engine.eval(new FileReader("com/corejava/chapter10/test.js"));Object goodbyeGreeter = engine.eval("new SimpleGreeter('goodbye')");Greeter g = ((Invocable)engine).getInterface(goodbyeGreeter, Greeter.class);String result = g.greet("World");System.out.println(result);// goodbye, World}
}</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">function greet(x)
{return "hello, " + x + "!";
}function SimpleGreeter(salutation)
{this.salutation = salutation;
}
SimpleGreeter.prototype.greet = function(whom)
{return this.salutation + ", " + whom + "!" ;
}</span>
【1.5】 编译脚本
<span style="font-family:Microsoft YaHei;font-size:14px;">Reader reader = new FileReader("script.js");
CompiledScript script = null;
if(engine implements Compilable)script = ((Compilable )engine).compile(reader);</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">if(script != null)script.eval();
elseengine.eval(reader);</span>
![](/assets/blank.gif)
<span style="font-family:Microsoft YaHei;font-size:14px;">public class CompileTest
{public static void main(String[] args) throws FileNotFoundException, ScriptException{// 脚本引擎管理器ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("JavaScript");// 读取器Reader reader = new FileReader("com/corejava/chapter10/test.js");CompiledScript script = null;if(engine instanceof Compilable){script = ((Compilable)engine).compile(reader); // 编译脚本}if(script != null){script.eval();System.out.println("执行编译后的脚本");}else{engine.eval(reader);System.out.println("执行脚本源码");}Object goodbyeGreeter = engine.eval("new SimpleGreeter('goodbye')");Greeter g = ((Invocable)engine).getInterface(goodbyeGreeter, Greeter.class);String result = g.greet("World");System.out.println(result);// goodbye, World}
}</span>
Attention) for complete source code about instances above, please visit https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/chapter10/10_1
【2】编译器API
【2.1】编译便捷之法
<span style="font-family:Microsoft YaHei;font-size:14px;">JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
OutputStream out = ...
OutputStream err = ...
int result = compiler.run(null, out, err, "-sourcepath", "src", "Test.java"); // 返回值为0 表示编译成功;</span>
![](/assets/blank.gif)
package com.corejava.chapter10_2;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;public class JavaCompilerTest
{public static void main(String[] args) throws FileNotFoundException{JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();OutputStream out = new FileOutputStream("out.txt");OutputStream err = new FileOutputStream("err.txt");System.out.println(compiler);System.out.println(System.getProperty("java.home"));int result = compiler.run(null, out, err, "com/corejava/chapter10_2/Hello.java");if(result == 0){System.out.println("bingo");}else{System.out.println("oops");}}
}
<span style="font-family:Microsoft YaHei;font-size:14px;">StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null) ;
Iterable<JavaFileObject> fileObjects = fileManager.getJavaFileObjectsFromStrings(filename);</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">Callable<Boolean> task = new JavaCompiler.compilationTasks(null, fileManager, diagnostics, options, null, fileObjects);
if(!task.call())println("compilation failed");</span>
java平台脚本+java编译器API相关推荐
- 【Java学习笔记】(二)Java平台和Java虚拟机
版权声明:所有笔记均来源于书籍<Java从小白到大牛完整版> 自我勉励:好记性不如烂笔头 Java平台和Java虚拟机 一.Java平台 1.Java SE 2.Java EE 3.Jav ...
- cxf springmvc_拥抱模块化Java平台:Java 10上的Apache CXF
cxf springmvc 自Java 9发布最终将Project Jigsaw交付给大众以来,已经过去了整整一年的时间. 这是一段漫长的旅程,但是在那里,所以发生了什么变化? 这是一个很好的问题,答 ...
- java cxf_拥抱模块化Java平台:Java 10上的Apache CXF
java cxf Java 9版本终于将Project Jigsaw交付给大众已经过去了一年的时间. 这是一段漫长的旅程,但是在那里,所以发生了什么变化? 这是一个很好的问题,答案并不明显和直接. 总 ...
- 拥抱模块化Java平台:Java 10上的Apache CXF
Java 9版本终于将Project Jigsaw交付给大众已经过去了一年多的时间. 这是一段漫长的旅程,但是在那里,所以发生了什么变化? 这是一个很好的问题,答案并不明显和直接. 总的来说, 拼图项 ...
- 杨晓峰-java核心技术36讲(学习笔记)- 第1讲 | 谈谈你对Java平台的理解?
杨晓峰-java核心技术36讲(学习笔记) 接下来我会分享杨晓峰-java核心技术36讲的学习笔记,内容较多,补充了其中一些牛人评论,相对详细(仅供个人学习记录整理,希望大家支持正版:https:// ...
- 浅谈Java平台无关性
为什么Java要支持平台无关性 众所周知,Java是平台无关的语言,那么Java为什么要支持平台无关性,总结一下,有如下几点 支持多变的网络环境.如今是一个互联网的时代,网络将各种各样的计算机和设备连 ...
- JAVA平台及其开发环境
首先要明确一下两个概念上的区别:JDK.SDK. SDK--soft development kit,软件开发工具包.sdk是一个大的概念,比如开发安卓应用,你需要安卓开发工具包,叫 android ...
- java毕业设计——基于java+JSP+MySQL的电脑彩票销售管理系统设计与实现(毕业论文+程序源码)——彩票销售管理系统
基于java+JSP+MySQL的电脑彩票销售管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+JSP+MySQL的电脑彩票销售管理系统设计与实现,文章末尾附有本毕业设计的 ...
- java毕业设计——基于java+jsp+Servlet的B2C网上拍卖系统设计与实现(毕业论文+程序源码)——网上拍卖系统
基于java+jsp+Servlet的B2C网上拍卖系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+jsp+Servlet的B2C网上拍卖系统设计与实现,文章末尾附有本毕业设 ...
最新文章
- 抓取了1400家科技公司的招聘信息,我发现数据工程师比数据科学家更有市场
- [导入]还原精灵安装失败!
- Symfony4中文文档: 安装和设置Symfony框架
- pycharm 如何搜索?Ctrl+N 搜索py文件 Ctrl+shift+N 搜索所有类型的文件 ctrl+shift+f 全局字符串搜索 ctrl+shift+a 配置项搜索 双shift全局
- .Net中删除数据前进行外键冲突检测
- Winform开发中另一种样式的OutLookBar工具条
- 前端学习(2607):vue指令
- Redis字符串深入
- 灰度调节_MIUI12稳定版第二批部分全量推送,小米8灰度测试,新增三大亮点
- java hasnext_java hasNext()使用实例解析
- java工程师什么城市就业_热门城市的Java薪资情况
- 诺顿企业版本最新版本14.2安装测试SymantecEndpointProtection_14.2.0_MP1
- java 什么时候使用内部类
- Python开发系列课程(14) - 玩转正则表达式
- 形容芝士蛋糕好吃的句子精选
- php转换音频采样率,非整数倍SRC采样率转换问题样本试听
- 使用shUnit2进行shell scritp自动化测试
- spark源码分析之ShuffleExternalSorter
- 阶乘之和 大数阶乘之和
- 今年的 WWDC 2017 为我们带来了什么?
热门文章
- 2021年广东工业大学第十五届文远知行杯程序设计竞赛(同步赛) H.有多短 思维
- [BZOJ3093][Fdu校赛2012] A Famous Game(不等概率)
- P7115-[NOIP2020]移球游戏【构造】
- nssl1478-题【dp】
- P1429-平面最近点对(加强版)【分治】
- P5091-[模板]欧拉定理
- nssl1304-最大正方形【二分答案】
- ssl提高组周六模拟赛【2018.9.23】
- jzoj3792,P2062-分队问题【贪心】
- 洛谷P2296-寻找道路【日常图论,最短路,SPFA】