java中使用javascript Nashorn引擎

原创 2017年03月27日 22:02:19



在混合语言编程中,就是语言与语言间的交互。

1   在java中调用javascript 函数


javascript文件:nashorn1.js

//定义javascript函数
var fun1 = function(name) {
    print('Hi there from Javascript, ' + name);
    return "greetings from javascript";
};

var fun2 = function (object) {
    print("JS Class Definition: " + Object.prototype.toString.call(object));
};

print("String :"+Object.prototype.toString("aaaa"))

java文件: nashorn1.java

<span style="white-space:pre">	</span>//获取nashorn javascript 运行时环境
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
        //加载并执行javascript脚本
        engine.eval(new FileReader("res/nashorn1.js"));
        
        Invocable invocable = (Invocable) engine;
        //调用javascript函数
        Object result = invocable.invokeFunction("fun1", "Peter Parker");
        System.out.println(result);
        System.out.println(result.getClass());
        
        invocable.invokeFunction("fun2", new Date());
        invocable.invokeFunction("fun2", LocalDateTime.now());
        invocable.invokeFunction("fun2", new Person());

参考:

Object.prototype.toString()函数

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString


2   在javascript调用java静态成员函数


javascript 脚本:nashorn2.js

//在javascript中调用java静态类以及静态方法
var Nashorn2 = Java.type('com.winterbe.java8.samples.nashorn.Nashorn2');
//调用静态方法
var result = Nashorn2.fun('John Doe');
print('\n' + result);

Nashorn2.fun2(123);
Nashorn2.fun2(49.99);
Nashorn2.fun2(true);
Nashorn2.fun2("hi there")
Nashorn2.fun2(String("bam"))
print('\n')
Nashorn2.fun2(new Number(23));
Nashorn2.fun2(new Date());
Nashorn2.fun2(new RegExp());
Nashorn2.fun2({foo: 'bar'});


print('passing object hash:');
Nashorn2.fun3({
    foo: 'bar',
    bar: 'foo'
});


print('passing custom person object:');

function Person(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.getFullName = function() {
        return this.firstName + " " + this.lastName;
    }
}

var person1 = new Person("Peter", "Parker");
Nashorn2.fun3(person1);
Nashorn2.fun4(person1);

java 文件:nashorn2.java

public class Nashorn2 {

    public static String fun(String name) {
        System.out.format("Hi there from Java, %s", name);
        return "greetings from java";
    }

    public static void fun2(Object object) {
        System.out.println(object.getClass());
    }
    //ScriptObjectMirror表示对javascript对象的映射
    //返回所有属性的键,包括不可迭代的属性
    public static void fun3(ScriptObjectMirror mirror) {
        System.out.println(mirror.getClassName() + ": " + Arrays.toString(mirror.getOwnKeys(true)));
    }
    //调用JavaScript对象的方法 
    public static void fun4(ScriptObjectMirror person) {
        System.out.println("Full Name is: " + person.callMember("getFullName"));
    }

    public static void main(String[] args) throws Exception {
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
        engine.eval(new FileReader("res/nashorn2.js"));
    }

}
Java.type()方法参考:
https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/api.html

ScriptObjectMirror对象:

http://cr.openjdk.java.net/~sundar/jdk.nashorn.api/8u20/javadoc/jdk/nashorn/api/scripting/ScriptObjectMirror.html


3 -在javascript中使用java对象

javascript 文件: nashorn3.js

print('------------------');
print('IntArray:');

var IntArray = Java.type('int[]');

var array = new IntArray(5);
array[0] = 5;
array[1] = 4;
array[2] = 3;
array[3] = 2;
array[4] = 1;

try {
    array[5] = 23;
} catch (e) {
    print("错误:"+e.message);
}

array[0] = "17";
print(array[0]);

array[0] = "wrong type";
print(array[0]);

array[0] = "17.3";
print(array[0]);

print('------------------');

for (var i in array) print(i);

print('------------------');

for each (var val in array) print(val);

print('------------------');
print('ArrayList:');

var ArrayList = Java.type('java.util.ArrayList');

var list = new ArrayList();
list.add('a');
list.add('b');
list.add('c');

for each (var el in list) print(el);


print('------------------');
print('HashMap:');

var HashMap = Java.type('java.util.HashMap');

var map = new HashMap();
map.put('foo', 'foo1');
map.put('bar', 'bar1');

for each(var e in map.keySet()) print(e);

for each(var e in map.values()) print(e);


print('------------------');
print('Streams:');

var list2 = new ArrayList();
list2.add("ddd2");
list2.add("aaa2");
list2.add("bbb1");
list2.add("aaa1");
list2.add("bbb3");
list2.add("ccc");
list2.add("bbb2");
list2.add("ddd1");

list2
    .stream()
    .filter(function(el) {
        return el.startsWith("aaa");
    })
    .sorted()
    .forEach(function(el) {
        print(el);
    });



print('------------------');
print('Extend:');

var Runnable = Java.type('java.lang.Runnable');
var Printer = Java.extend(Runnable, {
    run: function() {
        print('This was printed from a seperate thread.');
    }
});

var Thread = Java.type('java.lang.Thread');
new Thread(new Printer()).start();

new Thread(function() {
    print('this was printed from another thread');
}).start();


print('------------------');
print('Parameter Overload:');

var System = Java.type('java.lang.System');

System.out.println(10);
System.out["println"](11.0);
System.out["println(double)"](12);

print('------------------');
print('JavaBeans:');

var Date = Java.type('java.util.Date');
var date = new Date();
date.year += 1900;
System.out.println(date.year);

java文件:nashorn3.java

public class Nashorn3 {

    public static void main(String[] args) throws Exception {
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
        engine.eval("load('res/nashorn3.js')");
    }

}


Java 7 可运行的 Nashorn,代替 Rhino

惊现有人把 OpenJDK 上的 Nashorn dump 下来,使得 Java 7 都可以使用!源码在 https://bitbucket.org/ramonza/nashorn-backport/...
  • zhangxin09
  • zhangxin09
  • 2016年01月10日 22:41
  • 4412

Java8:使用新JS解释器Nashorn编译Lambda表达式

在最近的一篇文章中,我了解了一下Java8和Scala是如何实现 Lambda 表达式的。正如我们所知道的,Java8不仅对javac编辑器做了很大改进,它还加入了一个全新的项目---Nashorn...
  • tayanxunhua
  • tayanxunhua
  • 2014年03月11日 18:07
  • 9308

用 Rhino/Nashorn 代替第三方 JSON 转换库

Java 本身就自带 JS 引擎,自从 Java 1.6 开始就支持了,愈来愈好。我对 js 比较熟悉,因此有个大胆的想法,为什么不用自带 js 引擎作 json 转换呢?这样我们可以不用引入其他第三...
  • zhangxin09
  • zhangxin09
  • 2016年07月02日 13:57
  • 3664

Java8新JavaScript引擎nashorn使用实例

Java8 JS引擎nashorn的一个使用实例,其中包括Java->JS的参数传递和JS中Java对象的实例化...
  • chenhaotong
  • chenhaotong
  • 2015年12月10日 21:15
  • 5691

Java8 新特性之七---------Nashorn JavaScript引擎、Base64、并行数组

Nashorn JavaScript引擎 Java 8提供了新的Nashorn JavaScript引擎,使得我们可以在JVM上开发和运行JS应用。Nashorn JavaScript引擎是java...
  • tieselingzhi
  • tieselingzhi
  • 2016年10月14日 14:47
  • 545

hijk——使用JDK8中Javascript引擎Nashorn开发web和网络的应用框架

hijk 是一个简单实用的WebAPI开发包,使用了JDK8中新加入的执行命令 jjs 启动, 从服务器端到客户端都使用统一的JavaScript语言, 所有修改都会在访问时自动加载,而不需要再编译....
  • alaclp
  • alaclp
  • 2014年07月06日 05:52
  • 1015

hijk——使用JDK8中Javascript引擎Nashorn开发web和网络的应用框架

hijk 是一个简单实用的WebAPI开发包,使用了JDK8中新加入的执行命令 jjs 启动, 从服务器端到客户端都使用统一的JavaScript语言, 所有修改都会在访问时自动加载,而不需要再编译....
  • yiyihuazi
  • yiyihuazi
  • 2017年12月29日 14:01
  • 120

一篇文档掌握Jdk8中Javascript引擎Nashorn的用法

用Notepad++新建一js文件,F6运行命令为: npp_save cmd.exe /c jjs.exe -fx "$(FULL_CURRENT_PATH)" 代码内...
  • yiyihuazi
  • yiyihuazi
  • 2017年12月29日 13:55
  • 26

一篇文档掌握Jdk8中Javascript引擎Nashorn的用法

Java sdk8中Nashorn Javascript引擎的用法
  • alaclp
  • alaclp
  • 2014年06月26日 02:35
  • 2820

Java 8 的 Nashorn 脚本引擎教程

Nashorn JavaScript 引擎易于理解的代码例子。 Nashorn JavaScript 引擎是Java SE 8的一部分,它与其它像Google V8 (它是Google Chrome ...
  • qq_34730277
  • qq_34730277
  • 2017年05月29日 14:22
  • 234
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java中使用javascript Nashorn引擎
举报原因:
原因补充:

(最多只允许输入30个字)