java可用的动态脚本引擎和动态代码执行

完美体育365官方网站入口 admin 2025-07-29 14:23:04

文章目录

1、javascript语法引擎1.1、rhino1.2、nashorn1.3、j2v8

2、Java语法引擎2.1、Groovy

java的ScriptEngine脚本引擎,支持代码动态执行,代码修改后不需要重启JVM进程,就可以使用解析或编译方式执行,非常方便,在动态业务规则、热更新、热修复等场景中会非常方便。 本文介绍3个支持javascript语法和1个支持java语法和脚本引擎。

1、javascript语法引擎

支持运行javascript语法的脚本引擎,主要有三个:

1.1、rhino

官网:https://github.com/mozilla/rhino Rhino是JavaScript 的一种基于Java的实现,由Mozilla开发,JDK6和JDK7已集成,其它版本JDK需要添加依赖包。 pom.xml

org.mozilla

rhino-engine

1.7.14

使用例子

package com.penngo.script;

import javax.script.Invocable;

import javax.script.ScriptEngine;

import javax.script.ScriptEngineManager;

public class RhinoTest {

public static void main(String[] args) throws Exception{

String js = """

function add (a, b) {

var sum = a + b;

// js调用java类

java.lang.System.out.println("Script sum=" + sum);

return java.lang.Integer.valueOf(sum);

}

""";

//获得脚本引擎

ScriptEngineManager sem = new ScriptEngineManager();

ScriptEngine engine = sem.getEngineByName("rhino");

engine.eval(js);

Invocable jsInvoke = (Invocable) engine;

//java中调用js

Object result = jsInvoke.invokeFunction("add", new Object[] { 13.1, 20.1 });

System.out.println("Rhino result=" + result);

}

}

运行结果:

Script sum=33.2

Rhino result=33

1.2、nashorn

官网:https://github.com/openjdk/nashorn 在JDK8-JDK13,Nashorn取代Rhino成为Java的内置集成JavaScript引擎,Nashorn完整支持ECMAScript 5.1的规范以及一些扩展。在JDK8-JDK13外的版本需要添加依赖包: pom.xml

org.openjdk.nashorn

nashorn-core

15.4

使用例子

package com.penngo.script;

import javax.script.Invocable;

import javax.script.ScriptEngine;

import javax.script.ScriptEngineManager;

public class NashornTest {

public static void main(String[] args) throws Exception{

String js = """

// js调用java

var Integer = Java.type("java.lang.Integer");

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

function add (a, b) {

var sum = a + b;

System.out.println("Script sum=" + sum);

return Integer.valueOf(sum);

}

""";

ScriptEngineManager sem = new ScriptEngineManager();

ScriptEngine engine = sem.getEngineByName("nashorn");

engine.eval(js);

Invocable jsInvoke = (Invocable) engine;

//java中调用js

Object result = jsInvoke.invokeFunction("add", new Object[] { 13.1, 20.1 });

System.out.println("Nashorn result=" + result);

}

}

运行结果:

Script sum=33.2

Nashorn result=33

1.3、j2v8

官网:https://github.com/eclipsesource/j2v8 J2V8是一套针对谷歌浏览器chrome的V8 Javascript引擎的java绑定,支持在Android、Windows、Linux、MacOS上运行,需要根据不同平台使用不同时依赖包:

com.eclipsesource.j2v8

j2v8_win32_x86_64

4.6.0

不同平台的依赖包

j2v8_linux_x86_64j2v8_win32_x86_64j2v8_win32_x86j2v8_android_x86j2v8_android_armv7lj2v8_macosx_x86_64

2、Java语法引擎

2.1、Groovy

官网: http://groovy-lang.org/ https://github.com/groovy Groovy是在Java虚拟机上实现的动态语言,提供了动态将java代码编译为Java Class对象的功能。需要添加依赖包 pom.xml

org.codehaus.groovy

groovy-all

3.0.14

pom

使用例子

package com.penngo.script;

import groovy.lang.GroovyClassLoader;

import groovy.lang.GroovyObject;

public class GroovyTest {

public static void main(String[] args) throws Exception{

GroovyClassLoader loader = new GroovyClassLoader();

// java代码

String java = """

public class Test01 {

public int add(double a, double b) {

double sum = a + b;

System.out.println("Script sum=" + sum);

return sum.intValue();

}

}

""";

Class scriptClass = loader.parseClass(java);

GroovyObject scriptInstance = (GroovyObject) scriptClass.getDeclaredConstructor().newInstance();

Object result = scriptInstance.invokeMethod("add", new Object[]{13.1,20.1});

System.out.println("Groovy result=" + result);

}

}

运行结果

Script sum=33.2

Groovy result=33

本文测试源码