众所周知,在最新的JDK15当中,Nashorn已经被彻底移除。
然而,由于MineCraft的大部分用户都在使用Java15以下的版本
所以加载JavaScript的Bukkit插件仍然可以使用
这些插件我想大部分都在使用JDK自带的Nashorn引擎
然而这带来了一个问题
Nashorn当中加载这样的JavaScript代码
Java.type("")
在Java8当中,它返回一个jdk.internal.dynalink.beans.StaticClass
在Java9当中,不存在jdk.internal.dynalink.beans.StaticClass,只有jdk.dynalink这个包(JDK9实现模块化)
那么就会导致不兼容
之后我针对Graal引擎进行了测试,代码如下
package test;
import 省略
public class Test {
public static void main(String... args) throws Exception {
try (Context context = Context.newBuilder().allowAllAccess(true).build()) {
context.eval("js", "Java.type(\"test.Test\").test(Java.type(\"test.Test\"))");
}
}
public static void test(Object obj){
System.out.println(obj.getClass());
}
}
也就是说我执行了这么一段js
Java.type("test.Test").test(Java.type(xxxxxx))
第一个Java.type是拿到了我测试所用的类,test.Test
第二个则是调用这个类的静态方法test,传入的参数是Java.type返回的玩意
输出的是class java.lang.Class
也就是说,并没有jdk internal的东西了
取而代之的就是普普通通的java.lang.class,不存在版本兼容性的问题
那么我希望做一个小调查
如果你正在使用JavaScript写Bukkit插件,你的JS开发前置采用的是Nashorn还是Graal 还是Rhino等其他引擎?
如果你有意愿写一个加载JavaScript的插件(js runtime),你希望采用哪种引擎?
然而,由于MineCraft的大部分用户都在使用Java15以下的版本
所以加载JavaScript的Bukkit插件仍然可以使用
这些插件我想大部分都在使用JDK自带的Nashorn引擎
然而这带来了一个问题
Nashorn当中加载这样的JavaScript代码
Java.type("")
在Java8当中,它返回一个jdk.internal.dynalink.beans.StaticClass
在Java9当中,不存在jdk.internal.dynalink.beans.StaticClass,只有jdk.dynalink这个包(JDK9实现模块化)
那么就会导致不兼容
之后我针对Graal引擎进行了测试,代码如下
package test;
import 省略
public class Test {
public static void main(String... args) throws Exception {
try (Context context = Context.newBuilder().allowAllAccess(true).build()) {
context.eval("js", "Java.type(\"test.Test\").test(Java.type(\"test.Test\"))");
}
}
public static void test(Object obj){
System.out.println(obj.getClass());
}
}
也就是说我执行了这么一段js
Java.type("test.Test").test(Java.type(xxxxxx))
第一个Java.type是拿到了我测试所用的类,test.Test
第二个则是调用这个类的静态方法test,传入的参数是Java.type返回的玩意
输出的是class java.lang.Class
也就是说,并没有jdk internal的东西了
取而代之的就是普普通通的java.lang.class,不存在版本兼容性的问题
那么我希望做一个小调查
如果你正在使用JavaScript写Bukkit插件,你的JS开发前置采用的是Nashorn还是Graal 还是Rhino等其他引擎?
如果你有意愿写一个加载JavaScript的插件(js runtime),你希望采用哪种引擎?
然而,由于MineCraft的大部分用户都在使用Java15以下的版本
所以加载JavaScript的Bukkit插件仍然可以使用
这些插件我想大部分都在使用JDK自带的Nashorn引擎
然而这带来了一个问题
Nashorn当中加载这样的JavaScript代码
Java.type("")
在Java8当中,它返回一个jdk.internal.dynalink.beans.StaticClass
在Java9当中,不存在jdk.internal.dynalink.beans.StaticClass,只有jdk.dynalink这个包(JDK9实现模块化)
那么就会导致不兼容
之后我针对Graal引擎进行了测试,代码如下
package test;
import 省略
public class Test {
public static void main(String... args) throws Exception {
try (Context context = Context.newBuilder().allowAllAccess(true).build()) {
context.eval("js", "Java.type(\"test.Test\").test(Java.type(\"test.Test\"))");
}
}
public static void test(Object obj){
System.out.println(obj.getClass());
}
}
也就是说我执行了这么一段js
Java.type("test.Test").test(Java.type(xxxxxx))
第一个Java.type是拿到了我测试所用的类,test.Test
第二个则是调用这个类的静态方法test,传入的参数是Java.type返回的玩意
输出的是class java.lang.Class
也就是说,并没有jdk internal的东西了
取而代之的就是普普通通的java.lang.class,不存在版本兼容性的问题
那么我希望做一个小调查
如果你正在使用JavaScript写Bukkit插件,你的JS开发前置采用的是Nashorn还是Graal 还是Rhino等其他引擎?
如果你有意愿写一个加载JavaScript的插件(js runtime),你希望采用哪种引擎?
2021.12 数据,可能有更多内容
众所周知,在最新的JDK15当中,Nashorn已经被彻底移除。然而,由于MineCraft的大部分用户都在使用Java15以下的版本
所以加载JavaScript的Bukkit插件仍然可以使用
这些插件我想大部分都在使用JDK自带的Nashorn引擎
然而这带来了一个问题
Nashorn当中加载这样的JavaScript代码
Java.type("")
在Java8当中,它返回一个jdk.internal.dynalink.beans.StaticClass
在Java9当中,不存在jdk.internal.dynalink.beans.StaticClass,只有jdk.dynalink这个包(JDK9实现模块化)
那么就会导致不兼容
之后我针对Graal引擎进行了测试,代码如下
package test;
import 省略
public class Test {
public static void main(String... args) throws Exception {
try (Context context = Context.newBuilder().allowAllAccess(true).build()) {
context.eval("js", "Java.type(\"test.Test\").test(Java.type(\"test.Test\"))");
}
}
public static void test(Object obj){
System.out.println(obj.getClass());
}
}
也就是说我执行了这么一段js
Java.type("test.Test").test(Java.type(xxxxxx))
第一个Java.type是拿到了我测试所用的类,test.Test
第二个则是调用这个类的静态方法test,传入的参数是Java.type返回的玩意
输出的是class java.lang.Class
也就是说,并没有jdk internal的东西了
取而代之的就是普普通通的java.lang.class,不存在版本兼容性的问题
那么我希望做一个小调查
如果你正在使用JavaScript写Bukkit插件,你的JS开发前置采用的是Nashorn还是Graal 还是Rhino等其他引擎?
如果你有意愿写一个加载JavaScript的插件(js runtime),你希望采用哪种引擎?
萌新表示看不懂
我用的 虚幻4引擎
Doughface_girls 发表于 2020-10-25 15:51
我用的 虚幻4引擎
我说的是JavaScript加载引擎。。。
Rhino吧
Graal的javascript好像还没稳定吧
Graal的javascript好像还没稳定吧
洞穴夜莺 发表于 2020-10-25 15:55
Rhino吧
Graal的javascript好像还没稳定吧
还没用过Rhino,它好用吗?
William_Shi 发表于 2020-10-25 15:58
还没用过Rhino,它好用吗?
没用过,不过听说很nb
bleake 发表于 2020-10-25 15:49
萌新表示看不懂
我也是啊,压根没写过插件
猖09 发表于 2020-10-25 16:14
我也是啊,压根没写过插件
跟插件没啥关系吧
Nashorn是肯定不能要的,都0202年了还es5
William_Shi 发表于 2020-10-25 15:58
还没用过Rhino,它好用吗?
想一想WE用的就是它,它不好用吗?
哇,进来了一个不得了的贴,全是看不懂的代码
2119590076 发表于 2020-10-25 23:57
哇,进来了一个不得了的贴,全是看不懂的代码
只是一些简单的测试而已
今天在群里还看到你和别人讨论这个