关于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.142、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) //true3、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 //04、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! //35、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、官方文档
-
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.142、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) //true3、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 //04、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! //35、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呢 -
@as丶one said in 关于Nashorn JS引擎中Java的部分用法:
Nashorn JS 里是不是所有的结尾Object({})型参数都能写到括号外面? function呢@konoha-scarlet
不是这样的,这个只是Java.extend的特殊用法
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login