Java8 新JavaScript脚本引擎Nashorn小试

简介:

一个对Nashorn脚本引擎很详细地介绍: http://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/


下面是我测试的小例子,模拟在游戏中伤害计算脚本化:


ScriptTest.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package  com.zl1030.ScriptTest;
 
import  java.io.FileReader;
 
import  javax.script.Invocable;
import  javax.script.ScriptEngine;
import  javax.script.ScriptEngineManager;
 
public  class  ScriptTest {
 
     public  static  void  main(String[] args) {
         try  {
             ScriptEngineManager factory =  new  ScriptEngineManager();
             ScriptEngine engine = factory.getEngineByName( "nashorn" );
 
             String scriptPath = System.getProperty( "user.dir" ) +  "/Scripts/Test1.js" ;
 
             engine.eval( new  FileReader(scriptPath));
             Invocable invocable = (Invocable) engine;
             Test1 test1 = invocable.getInterface(Test1. class );
 
             ScriptResult result = (ScriptResult) test1.calc( new  A(),  new  A());
             System.out.println(test1.getLength( "abcdefg" ));
             System.out.println(result.getDamage() +  " "  + result.getTarget().getA() +  " "  + result.isResult());
 
         catch  (Exception e) {
             e.printStackTrace();
         }
     }
}


Test1.java:

1
2
3
4
5
6
7
8
package  com.zl1030.ScriptTest;
 
public  interface  Test1 {
     public  int  getLength(String msg);
 
     public  ScriptResult calc(A a, A b);
     
}

ScriptResult.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package  com.zl1030.ScriptTest;
 
public  class  ScriptResult {
     private  A target;
     private  boolean  result;
     private  int  damage;
 
     public  A getTarget() {
         return  target;
     }
 
     public  void  setTarget(A target) {
         this .target = target;
     }
 
     public  boolean  isResult() {
         return  result;
     }
 
     public  void  setResult( boolean  result) {
         this .result = result;
     }
 
     public  int  getDamage() {
         return  damage;
     }
 
     public  void  setDamage( int  damage) {
         this .damage = damage;
     }
}

A.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package  com.zl1030.ScriptTest;
 
public  class  A {
     private  int  a =  0 ;
     private  int  b =  0 ;
 
     public  int  getA() {
         return  a;
     }
 
     public  void  setA( int  a) {
         this .a = a;
     }
 
     public  int  getB() {
         return  b;
     }
 
     public  void  setB( int  b) {
         this .b = b;
     }
}

Test1.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var ScriptResultClass=Java.type('com.zl1030.ScriptTest.ScriptResult');
 
function getLength(msg) {
    return msg.length;
}
 
function calc(a, b) {
    a.setA(1);
    a.setB(2);
    var result = new ScriptResultClass();
    result.setTarget(a);
    result.setDamage(10);
    result.setResult(true);
 
    return result;
}

本文转自   zl1030   51CTO博客,原文链接:http://blog.51cto.com/zl1030/1660007
相关文章
|
11月前
|
JavaScript 前端开发 物联网
JavaScript:构建动态世界的引擎
JavaScript:构建动态世界的引擎
|
11月前
|
前端开发 JavaScript 开发者
JavaScript:构建动态网络的引擎
JavaScript:构建动态网络的引擎
|
JavaScript 前端开发 Java
通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
通义灵码新上的外挂 Project Rules 获得了开发者的一致好评:最小成本适配我的开发风格、相当把团队经验沉淀下来,是个很好功能……
2297 103
|
存储 监控 Java
“代码跑着跑着,就变快了?”——揭秘Java性能幕后引擎:即时编译器
HotSpot虚拟机内置C1和C2两个即时编译器。C1启动快,适合快速执行;C2优化强,适合长期运行。自Java 9起,默认启用C2或分层编译。分层编译结合C1与C2优势,共分5层,逐步提升编译质量。方法调用计数器与循环回边计数器用于识别热点代码,触发JIT编译。循环回边计数器还可启动栈上替换(OSR),提升大循环性能。本文详解JIT编译机制与性能优化策略。
496 75
|
11月前
|
JavaScript 前端开发 开发者
JavaScript:驱动现代Web的核心引擎
JavaScript:驱动现代Web的核心引擎
|
11月前
|
JavaScript 前端开发 物联网
JavaScript:驱动现代Web的核心引擎
JavaScript:驱动现代Web的核心引擎
|
编解码 JavaScript 前端开发
【Java进阶】详解JavaScript的BOM(浏览器对象模型)
总的来说,BOM提供了一种方式来与浏览器进行交互。通过BOM,你可以操作窗口、获取URL、操作历史、访问HTML文档、获取浏览器信息和屏幕信息等。虽然BOM并没有正式的标准,但大多数现代浏览器都实现了相似的功能,因此,你可以放心地在你的JavaScript代码中使用BOM。
434 23
|
JavaScript 前端开发 Java
【Java进阶】详解JavaScript事件
总的来说,JavaScript事件是JavaScript交互设计的核心,理解和掌握JavaScript事件对于编写高效、响应式的网页应用至关重要。
318 15
|
前端开发 JavaScript Java
【Java进阶】JavaScript电灯开关实例:从理论到实践
这个例子展示了JavaScript的基本功能,包括操作HTML元素,监听事件,以及改变元素的样式。通过学习和理解这个例子,你可以了解到JavaScript在网页中的应用,以及如何使用JavaScript来创建交互式的网页。
278 13
|
文字识别 监控 Java
顺丰同城抢单辅助脚本,顺丰骑士抢单辅助免封号,自动抢单神器【java版开源】
这是一套OCR实时检测订单列表并自动右滑的完整代码方案,适用于学习研究。代码包含四个主要模块:OCR处理(文字识别)、价格分析