关于Nashorn JS引擎中Java的部分用法
-
1、Java.type函数
参数:
Java类型的名称
返回:
表示该类型的对象(jdk.internal.dynalink.beans.StaticClass)
说明:
返回的对象是jdk.internal.dynalink.beans.StaticClass,你可以使用new操作符访问其构造函数,也可用直接访问其公开静态成员。
例子:
var System = Java.type("java.lang.System") System.out.println("Hello world!") //Hello world! var JDoubleArray = Java.type("double[]") var arr = new JDoubleArray(3) arr[0] = 0.5, arr[1] = 2.3, arr[2] = 3.14 for each(i in arr) print(i) //0.5 //2.3 //3.14
2、Java.from函数
参数:
Java数组或Collection
返回:
JavaScript数组
说明:
该函数会将Java数组或Collection转化为JavaScript数组
例子:
var JDoubleArray = Java.type("double[]") var arr = new JDoubleArray(3) arr[0] = 0.5, arr[1] = 2.3, arr[2] = 3.14 print(arr) //[D@20d28811 print(arr instanceof Array) //false arr = Java.from(arr) print(arr) //0.5,2.3,3.14 print(arr instanceof Array) //true
3、Java.to函数
参数:
1、JavaScript对象(一般为数组)
2、Java Collection或数组类型的 名称或者StaticClass
返回:
表示该类型的Java Collection或数组
说明:
该函数会将输入的对象转化为Java Collection或数组
例子:
var arr = [true, false, 3.14, null, "str"] print(arr) //true,false,3.14,,str arr = Java.to(arr,"int[]") for each(i in arr) print(i) //1 //0 //3 //0 //0
4、Java.extend函数
参数:
1、要一个或者多个父类或接口
2、重写函数对象(可省略)
返回:
指定Java类(或指定接口的实现)的子类的类型对象(jdk.internal.dynalink.beans.StaticClass)
说明:
要重写的函数必须是可被重写(即在Java中可用@Override修饰)的函数,Java.extend可以这种形式使用
Java.extend(ArrayList){size: function() { print("size invoked!"); }}
但这个是Nashorn JS引擎的特性,大部分JS引擎或者编辑器无法识别这种格式,这意味着如果需要使用一些工具对JS代码进行处理(如混淆)可能会出错,建议参照以下格式使用Java.extend。
例子:
var ArrayList = Java.type("java.util.ArrayList") var ArrayListExtender1 = Java.extend(ArrayList,{size: function() { print("size invoked!"); }}) var ArrayListExtender2 = Java.extend(ArrayList,{size: function() { print("size invoked!"); return 3;}}) var ExtendedArrayList1 = new ArrayListExtender1() var ExtendedArrayList2 = new ArrayListExtender2() print(ExtendedArrayList1.size()) //size invoked! //0 print(ExtendedArrayList2.size()) //size invoked! //3
5、Java.super函数
参数:
子类(jdk.internal.dynalink.beans.StaticClass)
返回:
父类(jdk.nashorn.internal.runtime.linker.JavaSuperAdapter)
说明:
当给定一个使用Java.extend()或等效机制(JS to Java Adapter),Java.super返回一个对象,可用于调用该对象的超类方法。
例子:
var ArrayList = Java.type("java.util.ArrayList") var ArrayListExtender = Java.extend(ArrayList,{size: function() { return 3;}}) var ExtendedArrayList = new ArrayListExtender() var ArrayL1st = Java.super(ExtendedArrayList) print(ExtendedArrayList.size()) //3 print(ArrayL1st.size()) //0
参考文献:
2、官方文档
-
@as丶one said in 关于Nashorn JS引擎中Java的部分用法:
Nashorn JS 里是不是所有的结尾Object({})型参数都能写到括号外面? function呢 -
@konoha-scarlet
不是这样的,这个只是Java.extend的特殊用法