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')");
    }

}


相关文章推荐

Java8新JavaScript引擎nashorn使用实例

Java8 JS引擎nashorn的一个使用实例,其中包括Java->JS的参数传递和JS中Java对象的实例化...

java8使用nashorn与javascript直接交互

直接在java中调用javascript代码,并且在js中使用java对象

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

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

Java 8的Nashorn脚本引擎教程

本文为了解所有关于 Nashorn JavaScript 引擎易于理解的代码例子。 Nashorn JavaScript 引擎是Java SE 8的一部分,它与其它像Google V8 (它是Goog...
  • hj7jay
  • hj7jay
  • 2016年12月26日 10:07
  • 942

Nashorn——在JDK 8中融合Java与JavaScript之力

从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino。该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript中调...
  • sqzhao
  • sqzhao
  • 2015年04月07日 13:25
  • 738

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

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

Java 中使用rhno引擎,运行JavaScript脚本,实现变量的交互、引入、传递

尝试了一下在Java 中使用rhino引擎,运行JavaScript脚本,现在将使用方法整理如下: 1.下载rhino引擎的文件,最后我获取到的是一个 js.jar 文件 2.将这...

Java 7 可运行的 Nashorn,代替 Rhino

惊现有人把 OpenJDK 上的 Nashorn dump 下来,使得 Java 7 都可以使用!源码在 https://bitbucket.org/ramonza/nashorn-backport/...

Java 8 Nashorn 介绍

Java 8 Nashorn 介绍从JDK6开始,Java就集成Javascript引擎(Rhino),为了提升性能,Nashorn 是java8内置的Javascript引擎,与大名鼎鼎的Googl...

Java 8新特性探究(十二)Nashorn :新犀牛

Nashorn是什么?如何用?性能怎样?有什么作用?本文将对这些问题进行解答。。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java中使用javascript Nashorn引擎
举报原因:
原因补充:

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