`
CshBBrain
  • 浏览: 650316 次
  • 性别: Icon_minigender_1
  • 来自: 成都
博客专栏
B7d9bf34-126e-301f-819e-81f2615b5a2a
开源WebSocket服务...
浏览量:144948
Group-logo
HTML5移动开发
浏览量:137893
社区版块
存档分类
最新评论

java6内置JS引擎初接触

 
阅读更多

转自:http://blog.csdn.net/sdyy321/article/details/6959199

由于要用到该技术,所以写了几个测试,直接上代码。

[java] view plaincopy
  1.   
[javascript] view plaincopy
  1.   

 

定义外部资源E:/ScriptEngine/test01.js

 

[javascript] view plaincopy
  1. if(age>=18){  
  2.     print('Old enough to vote!');  
  3. }else{  
  4.     print('Back to school!');  
  5. }  

 

 

定义外部资源E:/ScriptEngine/test02.js

 

[javascript] view plaincopy
  1. if(age<25){  
  2.     riskFactor = 1.5;  
  3. }else if(noClaims){  
  4.     ristFactor = 0.75;  
  5. }else{  
  6.     ristFactor = 1.0;  
  7. }  

 

 

定义外部资源E:/ScriptEngine/test03.js

[javascript] view plaincopy
  1. function Hello(){}   
  2. Hello.prototype.sayHello = function(value){  
  3.     println('hello!'+value);  
  4. }   
  5. var hello = new Hello();  
  6. hello.sayHello('World1');  

 

[java] view plaincopy
  1. //使用脚本引擎运行脚本程序  
  2. public static void test01() throws ScriptException{  
  3.     // 如果调用者可访问线程上下文 ClassLoader,则调用此构造方法的效果与调用 ScriptEngineManager(Thread.currentThread().getContextClassLoader()) 相同  
  4.     //ScriptEngineManager检索感兴趣的脚本编写的语言的ScriptEngine对象  
  5.     ScriptEngineManager manager = new ScriptEngineManager();  
  6.     ScriptEngine engine = manager.getEngineByName("js");//ScriptEngine用来处理脚本解释和求值  
  7.     engine.put("age"26);//赋值脚本环境中所使用的变量  
  8.     engine.eval("if(age>=18){println('Old enough to vote!');}else{println('Back to school!');}");//解析 JavaScript 脚本,对脚本表达式进行求值  
  9. }  

 

[java] view plaincopy
  1. //使用脚本引擎执行外部资源中的脚本  
  2. public static void test02() throws FileNotFoundException, ScriptException{  
  3.     ScriptEngineManager manager = new ScriptEngineManager();  
  4.     ScriptEngine engine = manager.getEngineByName("js");  
  5.     engine.put("age"26);  
  6.     engine.eval(new FileReader("E:/ScriptEngine/test01.js"));//对文件或其它外部资源中得脚本表达式进行求值  
  7. }  

 

 

[java] view plaincopy
  1. //使用脚本引擎检索结果  
  2. public static void test03() throws FileNotFoundException, ScriptException{  
  3.     ScriptEngineManager manager = new ScriptEngineManager();  
  4.     ScriptEngine engine = manager.getEngineByName("js");  
  5.     engine.put("age"26);  
  6.     engine.put("noClaims", Boolean.TRUE);  
  7.     Object result = engine.eval(new FileReader("E:/ScriptEngine/test02.js"));//eval()函数返回执行脚本后所返回的值,默认情况下,将返回上次执行的表达式的值  
  8.     System.out.println(result.toString());  
  9. }  

 

[java] view plaincopy
  1. //上下文属性的作用域  
  2. public static void test04() throws ScriptException{  
  3.     ScriptEngineManager manager = new ScriptEngineManager();  
  4.     Bindings globalBindings = manager.getBindings();//属于ScriptEngineManager的全局上下文,每个ScriptEngineManager拥有一个Bindings  
  5.     globalBindings.put("name""yangYong");  
  6.     ScriptEngine engine = manager.getEngineByName("js");  
  7.     Bindings globalBindings02 = engine.getBindings(ScriptContext.GLOBAL_SCOPE);//每个引擎都共有一个ScriptEngineManager的Bindings  
  8.     System.out.println("name="+globalBindings02.get("name"));  
  9.     System.out.println(globalBindings==globalBindings02);  
  10.     ScriptContext context = engine.getContext();//每个引擎都有自己独立的scriptContext上下文  
  11.       
  12.     Bindings engineDefaultBindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);//每个引擎的scriptContext中都有个默认属于自己的Bindings  
  13.     engineDefaultBindings.put("gender""男");  
  14.     engine.eval("name2 = name;println(name2);",engineDefaultBindings);  
  15.     engineDefaultBindings.put("name""zhangSan");  
  16.     engine.eval("name2 = name;println(name2);",engineDefaultBindings);  
  17.     Bindings engineCreatBindings = engine.createBindings();//每个引擎的scriptContext中也可以新建多个属于自己的Bindings  
  18.     engineCreatBindings.put("gender""女");  
  19.     System.out.println(engineDefaultBindings==engineCreatBindings);  
  20.     System.out.println(engine.getBindings(ScriptContext.ENGINE_SCOPE).get("gender"));  
  21.     System.out.println(engineCreatBindings.get("gender"));  
  22.     engine.eval("name2 = name;println(name2);",engineCreatBindings);  
  23. }  

 

[java] view plaincopy
  1. //java应用程序与脚本交互  
  2. public static void test05() throws FileNotFoundException, ScriptException{  
  3.     ScriptEngineManager manager = new ScriptEngineManager();  
  4.     ScriptEngine engine = manager.getEngineByName("js");  
  5.     Bindings bindings = engine.createBindings();//Bindings:KV对映射,用来在Java应用程序和javascript脚本之间交换信息,即上下文  
  6.     bindings.put("age"26);  
  7.     bindings.put("noClaims", Boolean.TRUE);  
  8.     bindings.put("riskFactor"1.0);  
  9.     engine.eval("if(age<25){riskFactor = 1.5;}else if(noClaims){ristFactor = 0.75;}else{ristFactor = 1.0;}",bindings);//必须绑定bindings执行脚本,否则报变量未定义异常  
  10.     double risk = (Double) bindings.get("riskFactor");  
  11.     System.out.println(risk);  
  12. }  

 

[java] view plaincopy
  1. //使用脚本引擎运行脚本程序  
  2. public static void test01() throws ScriptException{  
  3.     // 如果调用者可访问线程上下文 ClassLoader,则调用此构造方法的效果与调用 ScriptEngineManager(Thread.currentThread().getContextClassLoader()) 相同  
  4.     //ScriptEngineManager检索感兴趣的脚本编写的语言的ScriptEngine对象  
  5.     ScriptEngineManager manager = new ScriptEngineManager();  
  6.     ScriptEngine engine = manager.getEngineByName("js");//ScriptEngine用来处理脚本解释和求值  
  7.     engine.put("age"26);//赋值脚本环境中所使用的变量  
  8.     engine.eval("if(age>=18){println('Old enough to vote!');}else{println('Back to school!');}");//解析 JavaScript 脚本,对脚本表达式进行求值  
  9. }  

 

 

 

[java] view plaincopy
  1. //脚本内部访问java资源  
  2. public static void test06() throws ScriptException{  
  3.     ScriptEngineManager manager = new ScriptEngineManager();  
  4.     ScriptEngine engine = manager.getEngineByName("js");  
  5.     engine.eval("importPackage(java.util)");//importPackage()函数允许在脚本内部导入java包,即可在脚本中实例化java对象  
  6.     engine.eval("today = new Date();println(today);");  
  7.     engine.put("name""ZhangSan");  
  8.     engine.eval("name2 = name.toUpperCase();println(name2);");  
  9. }  

 

[java] view plaincopy
  1. //重定向脚本输出  
  2. public static void test07() throws IOException, ScriptException{  
  3.     ScriptEngineManager manager = new ScriptEngineManager();  
  4.     ScriptEngine engine = manager.getEngineByName("js");  
  5.       
  6.     PipedReader pr = new PipedReader();  
  7.     PipedWriter pw = new PipedWriter(pr);  
  8.     //用户可以通过与这个 PrintWriter 连通的 PrintReader 读取实际的输出,使 Java 应用程序能获取脚本运行输出  
  9.     PrintWriter out = new PrintWriter(pw);  
  10.     engine.getContext().setWriter(out);  
  11.       
  12.     engine.eval("println('hello from javascript!');");  
  13.       
  14.     BufferedReader br = new BufferedReader(pr);  
  15.     System.out.println(br.readLine());  
  16. }  

 

[java] view plaincopy
  1. //可编译且可调用的引擎  
  2.     public static void test08() throws ScriptException{  
  3.         ScriptEngineManager manager = new ScriptEngineManager();  
  4.         ScriptEngine engine = manager.getEngineByName("js");  
  5.         if(engine instanceof Compilable){//判断脚本引擎是否支持编译操作  
  6.             Compilable compilable = (Compilable)engine;//用来保存编译的结果,从而能重复调用脚本而没有重复解释的开销  
  7.             //compile()方法将脚本编译成无需重新编译就能反复执行的CompiledScript容器  
  8.             CompiledScript script = compilable.compile("if(age<25){riskFactor = 1.5;}else if(noClaims){ristFactor = 0.75;}else{ristFactor = 1.0;}");  
  9.               
  10.             Bindings bindings = engine.createBindings();  
  11.             bindings.put("age"26);  
  12.             bindings.put("noClaims", Boolean.TRUE);  
  13.             bindings.put("riskFactor"1.0);  
  14.               
  15.             Object result = script.eval(bindings);//使用CompiledScript的eval()方法计算编译后的表达式  
  16.             System.out.println(result.toString());  
  17.         }  
  18.     }  

 

[java] view plaincopy
  1. //调用脚本中的函数和方法  
  2. public static void test09() throws ScriptException, NoSuchMethodException, FileNotFoundException{  
  3.     ScriptEngineManager manager = new ScriptEngineManager();  
  4.     ScriptEngine engine = manager.getEngineByName("js");  
  5.     engine.eval("function increment(i){return i+1;}");  
  6.     if (engine instanceof Invocable) {//判断脚本引擎是否支持编译操作  
  7.         Invocable invocable = (Invocable)engine;//Invocable允许从java代码调用定义在脚本中的单个函数  
  8.         Object result = invocable.invokeFunction("increment"new Object[]{10});// 调用脚本中定义的顶层程序和函数  
  9.         System.out.println("result = "+result);  
  10.     }  
  11.       
  12.     ScriptEngine engine2 = manager.getEngineByName("js");  
  13.     engine2.eval(new FileReader("E:/ScriptEngine/test03.js"));  
  14.     if(engine2 instanceof Invocable){  
  15.         Invocable invocable = (Invocable)engine2;  
  16.         invocable.invokeMethod(engine2.get("hello"), "sayHello""yangYong");//对以前的脚本执行中已经编译的脚本对象(以 ScriptEngine 的状态保持)调用某一方法  
  17.     }  
  18. }  

 

定义java文件Hello.java

 

[java] view plaincopy
  1. public interface Hello {  
  2.     public int increment(int value);  
  3.     public void sayHello(String name);  
  4. }  

 

[java] view plaincopy
  1. //调用脚本中的函数和方法并将他们作为java程序中的接口实现  
  2. public static void test10() throws FileNotFoundException, ScriptException{  
  3.     ScriptEngineManager manager = new ScriptEngineManager();  
  4.     ScriptEngine engine = manager.getEngineByName("js");  
  5.     engine.eval("function increment(i){return i+1;}");  
  6.     if (engine instanceof Invocable) {  
  7.         Invocable invocable = (Invocable)engine;  
  8.         Hello hello = invocable.getInterface(Hello.class);//返回一个接口的实现,该接口使用解释器中编译的函数  
  9.         Object result = hello.increment(2);  
  10.         System.out.println("result = "+result);  
  11.     }  
  12.     engine.eval(new FileReader("E:/ScriptEngine/test03.js"));  
  13.     if(engine instanceof Invocable){  
  14.         Invocable invocable2 = (Invocable)engine;  
  15.         Hello hello = invocable2.getInterface(engine.get("hello"), Hello.class);// 返回一个接口的实现,该接口使用解释器中已编译脚本对象的成员函数  
  16.         hello.sayHello("zhangSan");  
  17.     }  
  18. }  

 

分享到:
评论

相关推荐

    是运行JAVA script的必备文件

    现代的JavaScript主要通过Web浏览器内置的JavaScript引擎来解释和执行,如Chrome的V8引擎、Firefox的SpiderMonkey、Safari的JavaScriptCore等。这些引擎支持ECMAScript标准,它是JavaScript的标准化版本。因此,现在...

    steam热销游戏信息抓取,基于node.js , python , java分别实现.zip

    标题 "steam热销游戏信息抓取,基于node.js , python , java分别实现.zip" 提供了三个关键编程语言——Node.js、Python和Java,用于实现一个特定任务:抓取Steam平台上的热销游戏信息。这个项目可能涉及到网络爬虫的...

    管理系统系列--Java组件课程设计-基于SpringBoot的酒店管理系统.zip

    6. **模板引擎**:使用Thymeleaf或Freemarker等模板引擎生成动态HTML页面。 7. **单元测试**:使用JUnit和Mockito等工具编写单元测试,确保代码质量。 8. **持续集成/持续部署(CI/CD)**:通过Jenkins、GitLab CI/...

    毕业设计+计算机期末作业+Java+springboot运行教学(idea+eclipse配置教程 代码讲解 部署视频 )

    总结来说,这个教学资料包全面覆盖了Java+Spring Boot的开发环境配置、代码编写、项目运行和部署等多个环节,无论你是初次接触还是希望深入理解,都将从中受益匪浅。通过实践,你将能够构建自己的Spring Boot应用,...

    JAVA

    它是解释型的脚本语言,不需要预编译,由浏览器的JavaScript引擎执行。JavaScript的核心特性包括函数作为一等公民、原型继承和动态类型。 在JavaScript中,DOM(Document Object Model)是HTML或XML文档的结构化...

    Java-SpringBoot校园学生疫情防控系统毕业设计源码(源代码+论文)

    SpringBoot是Java领域的一个流行框架,它简化了微服务开发流程,通过内置的Tomcat服务器、自动配置和起步依赖,可以快速构建可部署的应用程序。在这个项目中,SpringBoot被用来搭建后台服务,提供了强大的依赖管理和...

    jdk api 1.8_google.zip

    9. ** Nashorn JavaScript引擎**:JDK 1.8包含了Nashorn JavaScript引擎,允许在Java应用中执行JavaScript代码,提供了JavaScript与Java之间的互操作性。 10. **并发改进**:更新了`ForkJoinPool`和`...

    javascript 基础教程

    - **浏览器**:现代浏览器都内置了JavaScript引擎,可以选择Chrome、Firefox等进行测试。 #### 四、JavaScript语言基础 - **插入位置**:JavaScript可以在HTML文档的`&lt;head&gt;`标签内或`&lt;body&gt;`标签内的任意位置插入...

    Cocos2D-X游戏开发技术精解

    2.3.1 Java与C++的混合编译 38 2.3.2 Objective-C与C++的混合编译 41 2.4 引擎的启点 42 2.4.1 应用程序入口 43 2.4.2 引擎应用入口 44 2.5 丰富的示例程序 46 2.5.1 TestCpp示例项目 46 2.5.2 脚本示例项目 ...

    java6.0源码-lussumo-vanilla:从code.google.com/p/lussumo-vanilla自动导出

    6. **JavaScript引擎Rhino**:内置了JavaScript引擎Rhino,使得在Java应用程序中嵌入和执行JavaScript代码成为可能。 7. **JDBC 4.0**:更新了 JDBC API,提供了自动连接管理和连接池的改进。 8. **JavaFX**:首次...

    JME3中文教程(ZBP第一版)

    11. **脚本系统**:学习如何使用内置的LUA或JavaScript脚本引擎,编写游戏逻辑。 12. **插件系统**:了解如何扩展JME3的功能,使用或开发自定义插件。 通过深入学习这些内容,你将具备使用JME3开发3D游戏的能力。...

    北大青鸟S2完整知识点

    jQuery是一个JavaScript库,简化了JavaScript的DOM操作、事件处理、动画制作以及Ajax交互。它提供了一种简洁的方式来选择和操作HTML元素,使得前端开发更加高效。了解jQuery的核心函数,如`$(selector).action()`,...

    北大青鸟学士后U2项目

    学士后U2项目会涵盖JSP基本语法、内置对象(如request、response、session、application等)、EL(表达式语言)和JSTL(JavaServer Pages Standard Tag Library)。同时,课程还会涉及Servlet技术,它是JSP背后的...

    c语言也能干大事6_高清版

    许多现代的编程语言,如Python、Java和JavaScript,它们的解释器或编译器都是用C或C++编写的。因此,精通C语言有助于理解这些高级语言的工作原理。 在"**C语言也能干大事6**"的学习过程中,你将有机会深化对指针的...

    基于SpringBoot的酒店预订系统.zip

    在项目实践中,开发者可能还接触到了其他如Docker容器化部署、Spring Cloud微服务架构、Redis缓存、Elasticsearch搜索引擎等高级技术。这个项目不仅锻炼了开发者的技术能力,也提升了他们的项目管理和团队协作技巧。...

    HarmonyOS应用开发-JS相关整体梳理.docx

    需要注意的是,如果使用Java进行FA应用开发,则需参考Java UI框架的相关资料。 ##### 前端框架层(Framework) 前端框架层主要负责前端页面的解析工作,同时提供了MVVM(Model-View-ViewModel)开发模式、页面路由...

Global site tag (gtag.js) - Google Analytics