Java 脚本 引擎 jsr223 与 javascript 文件交互

在Java中执行JavaScript:跨语言编程实践指南 在Java平台中,长期以来,开发者都依赖于反射机制来动态地处理代码和执行表达式。然而,随着Web 2.0的兴起,越来越多的Web应用需要使用到JavaScript等脚本语言,以实现实时的数据交互和动态内容更新。为了更好地集成这些脚本语言,Java平台需要一个统一的API,以简化与不同脚本语言的交互。Java Scripting API(JSR 223)应运而生,它提供了一种标准的方式来嵌入和执行脚本语言,使得Java程序可以更加方便地利用这些脚本语言的功能。 阅读详情

JDK1.6开始,Java引入了jsr223,就是可以用一致的形式在JVM上执行一些脚本语言,如js脚本,本文详细说明了java脚本引擎的使用方式,并贴出了大量的经过实际测试的java源代码,请各位参考:

Java 脚本引擎技术相关内容,都已经在Java代码中以注释的形式说明了,请测评:


package jaas;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.script.*;
import java.io.File;
import java.util.*;

public class Test {

    /**
     * 文中的某些示例用到了 JNDI,需要提供 JNDI 实现者,参数:-Djava.naming.factory.initial=org.apache.naming.java.javaURLContextFactory
     * 使用了 Tomcat 的 JNDI 实现,添加依赖:
     * <dependency>
     * <groupId>org.apache.tomcat</groupId>
     * <artifactId>tomcat-catalina</artifactId>
     * <version>8.5.6</version>
     * </dependency>
     */
    public static void main(String[] args) throws Exception {
        // 获取脚本引擎管理器
        ScriptEngineManager manager = new ScriptEngineManager();
        List<ScriptEngineFactory> engineFactories = manager.getEngineFactories();
        System.out.println("当前 JVM 支持的脚本引擎:");
        for (ScriptEngineFactory sef : engineFactories) {
            System.out.println("引擎名称:" + sef.getEngineName());
            System.out.println("\t 别名:" + sef.getNames());
            System.out.println("\t MimeTypes:" + Arrays.asList(sef.getMimeTypes()));
        }
        System.out.println();
        // 获取指定的 js 脚本引擎
        ScriptEngine jsEngine = manager.getEngineByName("js");
//        ScriptEngine jsEngine = manager.getEngineByName("javascript");
//        ScriptEngine jsEngine = new ScriptEngineManager().getEngineByMimeType("text/javascript");

        // 引擎测试

        /**
         * 脚本语言支持API使用语言绑定对象实现Java语言编写的程序与脚本语言间的数据传递。
         * 语言绑定对象实际上就是一个简单的哈希表,用来存放和获取需要共享的数据,
         * 其定义的接口为javax.script.Bindings,继承自java.util.Map接口。
         * 一个脚本引擎在执行过程中可能会使用多个语言绑定对象,不同语言绑定对象的作用域不同。
         * ScriptEngine类提供out和get方法对脚本引擎中特定作用域的默认语言绑定对象进行操作。
         */
        testEngine(jsEngine);
        //
        testContext_Java_Params(jsEngine);
    }

    public static void testEngine(ScriptEngine engine) throws Exception {
        engine.put("name", "张三");// 参数
        engine.eval("var msg = '你好, ' + name;");// 使用某作用域的参数
        engine.eval("println('js println: '+msg);");// 使用某作用域的参数
        Object obj = engine.get("msg");// java 可获取到 js 脚本返回的对象
        System.out.println("java println: " + obj);
        System.out.println();

        // 自定义语言绑定对象(如语言绑定对象中包含程序自己独有的数据等情形……)
        Bindings bindings = new SimpleBindings();
        bindings.put("fruit", "Apples");
        engine.eval("println('I like ' + fruit);", bindings);
        System.out.println();

        ScriptContext context = engine.getContext();// 获取引擎默认的上下文

        // 重定向输出到文件
//        context.setWriter(new FileWriter("/home/conquer/Desktop/a.txt"));
        engine.eval("println('Hello World, I am from Js script.');");
        System.out.println();

        // 绑定对象作用域1
        context.setAttribute("name", "张三", ScriptContext.GLOBAL_SCOPE);//从同一引擎工厂中创建的所有脚本引擎对象
        context.setAttribute("name", "李四", ScriptContext.ENGINE_SCOPE);//当前的脚本引擎对象
        Object name = context.getAttribute("name");//值按优先级为 李四
        System.out.println(name);
        System.out.println();

        // 绑定对象作用域2
        Bindings bindings1 = engine.createBindings();
        bindings1.put("name", "张三");
        context.setBindings(bindings1, ScriptContext.GLOBAL_SCOPE);
        Bindings bindings2 = engine.createBindings();
        bindings2.put("name", "李四");
        context.setBindings(bindings2, ScriptContext.ENGINE_SCOPE);
        engine.eval("println('脚本按优先级得到参数:'+name);");    //李四
        System.out.println();

        Bindings bindings3 = context.getBindings(ScriptContext.ENGINE_SCOPE);// 直接获取当前引擎作用域参数集合
        Bindings bindings4 = context.getBindings(ScriptContext.GLOBAL_SCOPE);// 直接获取所有引擎作用域参数集合

        context.setAttribute("name", "张三", ScriptContext.GLOBAL_SCOPE);// 属性设置也具有作用域的选择
//        engine.eval("println(name);");

        // b编译运行,提升脚本运行效率
        if (engine instanceof Compilable) {
            String performanceTest = "var a = 100;\n" +
                    "var b = 100+a;\n" +
                    "var c = a+b;\n" +
                    "println(c);" +
                    "println('');";
            Compilable compilable = (Compilable) engine;
            CompiledScript compiledScript = compilable.compile(performanceTest);
            compiledScript.eval();
        }

        // 脚本中 调用 java 方法
        File file = new File("/home/conquer/mine/work_space/idea/Eden/jse/src/main/java/jaas/loginscript.js");
        engine.put("file", file);

        Bindings engineBindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
        engineBindings.put("file2", file);

        engine.eval("println('脚本中执行java对象方法:'+file.getAbsoluteFile())");
        engine.eval("println('脚本中执行java对象方法2:'+file.getAbsoluteFile())");
        engine.eval("println(file.getAbsolutePath());");
        Object eval1 = engine.eval("file.getAbsolutePath();");
        System.out.println("打印js从java得到的数据:" + eval1);
        engine.eval("println(file.isHidden());");

        Properties temp = new Properties();
        temp.setProperty("aaa", "aaaaa");
        engineBindings.put("properties", temp);
        engine.eval("println(properties.toString());");
        Object eval2 = engine.eval("properties.toString();");
        System.out.println("打印js从java中读取Properties:" + eval2);
        engine.eval("println(properties.getProperty('aaa'));");
        Object eval3 = engine.eval("properties.getProperty('aaa');");
        System.out.println("打印js从java中读取Properties,key 为 aaa:" + eval3);

        SayHello sayHello = new SayHello();
        engine.put("sayHello1", sayHello);
        engine.getBindings(ScriptContext.ENGINE_SCOPE).put("sayHello2", sayHello);
        engine.eval("println(sayHello1.hello('张三111'))");// 注意类必需声明为 public的
        Object hello = engine.eval("sayHello2.hello('张三222')");// 注意类必需声明为 public的
        System.out.println("js 获取到的java返回:" + hello);// ok

        // 也可以通过下面的方式将 实参 放到 jndi 上下文中获取,脚本中仍然使用形式参数
        ScriptContext scriptContext = new SimpleScriptContext();
        Bindings bindings5 = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
        bindings5.put("name", "张三");
        Context ctx = new InitialContext();// 这里是启动之前设置的 tomcat的 jndi 实现
        ctx.bind("jndiObj", sayHello);

        Object eval = engine.eval("var ctx = new javax.naming.InitialContext();\n" +
                "var myBean = ctx.lookup(\"jndiObj\");\n" +
                "myBean.hello(name);", scriptContext);
//                "myBean.hello('name');", scriptContext);// 使用 jndi 保存参数,这里不需要传递 实际参数
        System.out.println("js 调用 java 方法返回值:" + eval);
        System.out.println();

        // 方法调用,Java 调用 脚本中定义的方法
        /**
         * 虚拟机支持脚本的意义在于实现函数式的编程,脚本中最重要的便是方法,
         * 脚本引擎允许使用者单独调用脚本中的某个方法,
         * 支持此操作的脚本引擎可以通过实现javax.script.Invocable接口。
         * JavaSE中的JavaScript引擎已实现了Invocable接口。
         */
        if (engine instanceof Invocable) {
            String scriptText = "function greet(name) { println('Hello, ' + name); } ";
            engine.eval(scriptText);// 这里是在定义 greet 方法,只有定义以后才能进行调用:invokeFunction
            Invocable invocable = (Invocable) engine;
            invocable.invokeFunction("greet", "张三");// 调用方法,并传递参数

            // 调用成员方法
            String scriptText2 = "var obj = { getGreeting : function(name) { return 'Hello, ' + name; } }; ";
            engine.eval(scriptText2);// 定义脚本对象,并且定义对象成员方法
            Object scriptObj = engine.get("obj");//获取到脚本中的实例化的对象
            Object result = invocable.invokeMethod(scriptObj, "getGreeting", "张三");   //第一个参数为方法所属对象,后面调用对象的方法和参数
            System.out.println(result);

            // 脚本方法 Java 化 !!! 是指将 java 的调用自动映射到脚本中方法执行上,
            // 需要用到java 接口,接口的方法定义和脚本中方法定义一致,即:脚本作为 接口 的实现类
            String scriptText3 = "function getGreeting(name) { " +
                    "println('我是 Java 定义的 Greet 接口的具体实现哦...');" +
                    "return '你好, ' + name; } ";
            engine.eval(scriptText3);
            Greet greet = invocable.getInterface(Greet.class);
            System.out.println(greet.getGreeting("Alex"));
        }
    }

    interface Greet {
        String getGreeting(String name);
    }

    public static void testContext_Java_Params(ScriptEngine engine) throws Exception {
        Map<String, String> params = new HashMap() {{
            // 脚本中需要的形参名称及对应的实参值
            put("user", "admin");// 必需包含 js 脚本中调用的LoginBean.authenticate类方法需要的参数
            put("password", "pwd");// 必需包含 js 脚本中调用的LoginBean.authenticate类方法需要的参数
        }};

        // 脚本需要的 ScriptContext 对象,脚本中引起的参数都需要从这个对象里面获取
        ScriptContext scriptContext = new SimpleScriptContext();//也可以在这里直接 new 出来
//        ScriptContext scriptContext = engine.getContext();// 构造参数里面也是直接 new 出来的

        /**
         * 绑定参数两个作用域:
         * ScriptContext.ENGINE_SCOPE(当前的脚本引擎)
         * ScriptContext.GLOBAL_SCOPE(从同一引擎工厂中创建的所有脚本引擎对象)
         */

        // 绑定方式1
        Bindings bindings = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
        // 脚本中需要的形参名称及对应的实参值
//        bindings.put("user", "admin");
//        bindings.put("password", "pwd");
        bindings.putAll(params);

        // 绑定方式2
//        for (Map.Entry<String, String> e : params.entrySet()) {
//            scriptContext.setAttribute(e.getKey(), e.getValue(), ScriptContext.GLOBAL_SCOPE);
//        }


        // 写自己的这个 JNDI 上下文,是因为 js 脚本中的内容要用到 应用自定义的对象,而在脚本中不能创建 非 java 的对象
        // 所以我们事先创建好,放到 JNDI 上下文,以供脚本中 lookup 查找并使用对象
        InitialContext context = new InitialContext();
        context.bind("script_ref_obj", new LoginBean());

        String scriptText = getScriptText();
        System.out.println("脚本内容:");
        System.out.println(scriptText);
        System.out.println();

        List<String> myGroups = (List<String>) engine.eval(scriptText, scriptContext);// 脚本的最后以后具有返回值的可以在这里获取到!!
        System.out.println("脚本执行后的返回值:");
        System.out.println(myGroups);
    }

    /**
     * Scanner 类用于扫描、接收、分段处理字符串,可以指定分割符号,
     * 通过 一系列的 nextXXX() 可以依次获取到分割的内容片段
     * <p>
     * Scanner 可以接入一个 InputStream 或者一个 File(内部转为FileInputStream)以作为字符输入端
     */
    private static String getScriptText() throws Exception {
//        测试的话,可以将脚本内容直接硬编码写在这里:
        String jsText = "println(\"js begin invoke...\");\n" +
                "var ctx = new javax.naming.InitialContext();\n" +
                "var myBean = ctx.lookup(\"script_ref_obj\");\n" +
                "myBean.authenticate(user, password);";
        return jsText;


//        从文件中读取脚本
//        Scanner 可以采用正则表达式分段读取字符串内容,分段符合可以使用 useDelimiter 方法指定
//        如果不写,默认是空格分割 scanner.useDelimiter(",") 表示以“,”分割读取内容
//        File script = new File("/home/conquer/mine/work_space/idea/Eden/jse/src/main/java/jaas/loginscript.js");
//        Scanner scanner = new Scanner(script).useDelimiter("\\Z");
//        return scanner.next();
    }
}

package jaas;

import javax.security.auth.login.FailedLoginException;
import java.util.Arrays;
import java.util.List;

public class LoginBean {

    public List<String> authenticate(String user, String password) throws FailedLoginException {
        System.out.println("从 js 脚本调入进来的 java 方法开始执行...");
        System.out.println("user:" + user);
        System.out.println("password:" + password);
        if (true) {// test
            return Arrays.asList("adminRole", "tomcatRole");
        }

        if ("paul".equals(user) && "michelle".equals(password)) {
            return Arrays.asList("Manager", "rockstar", "beatle");
        }

        if ("eddie".equals(user) && "jump".equals(password)) {
            return Arrays.asList("Employee", "rockstar", "vanhalen");
        }

        throw new FailedLoginException("Bad user or password!");
    }
}


package jaas;

public class SayHello {
    public String hello(String name) {
        System.out.println("java 方法执行");
        return "你好," + name;
    }
}

loginscript.js 脚本文件内容:

println("js begin invoke...");
var ctx = new javax.naming.InitialContext();
var myBean = ctx.lookup("script_ref_obj");
myBean.authenticate(user, password);


JShellScriptEngine:JSR-223 JShell脚本引擎 JShellScriptEngine 一个用于Java的JSR-223 ScriptEngine,它允许通过Java 9中的JShell repl执行Java代码段。 这将在当前JVM中运行JShell脚本,从而允许来回传递变量。 用法 ScriptEngine engine = new ScriptEngineManager().getEngineByName("jshell"); assertEquals("Hello World!", (engine.eval("\"Hello World!\""))); 建造 用ant构建: ant jar 然后将dist/jshellscriptengine.jar复制到您的类路径中。 立即下载

相关推荐

jav8:基于 Google V8 Javascript 引擎的 Java Scripting API (JSR223) 实现

基于 Google V8 Javascript 引擎的 Java Scripting API (JSR223) 的实现。 Java 规范请求 (JSR) 223 通过定义标准框架和应用程序编程接口 (API) 来帮助开发人员集成 Java 技术和脚本语言,以执行以下操作: 从脚本环境访问和控制基于 Java 技术的对象 使用脚本语言创建 Web 内容 在基于 Java 技术的应用程序中嵌入脚本环境 有关更多详细信息,请阅读 要使用 Jav8 脚本引擎,请将文件 jav8-jsr223-xxx.jar 放在您的类路径中。 然后你可以通过这种方式获得引擎的一个实例: ScriptEngineManager factory = new ScriptEngineManager (); ScriptEngine engine = factory . getEngineByName( " ja

JMeter接口自动化测试实例—JMeter引用javaScript

但在这里我就简单的应用javaScript生成当前时间来做为例子,看如何在JMeter中使用JavaScript脚本的。整个实例就是为了演示在JSR223 PreProcessor中生成HTTP请求的一个入参,然后得到响应后,可以通过JSON Extractor取出指定想到的信息,再通过BeanShell Assertion进行简单的校验断言,如果一直没有问题,再发起一个HTTP请求,其中的一个参数就是上一个HTTP请求响应解析入来的值。接下来的HTTP请求,有用来前面设置的变量和响应解析出来的变量。

2301_76643199的博客 1406

jsr203-hadoop:HDFS的Java NIO文件系统提供程序

jsr203-hadoop Hadoop分布式文件系统的JSR 203实现 Maven神器 < dependency> < groupId>com.github.jsr203hadoop</ groupId> < artifactId>jsr203hadoop</ artifactId> < version>1.0.3</ version> </ dependency> 先决条件 jsr203-hadoop要求: 吉特 Maven 3.0.4(或更高版本) JDK 1.7(或更高版本) 下载并构建 $ git clone git://github.com/damiencarol/jsr203-hadoop.git $ cd jsr203-hadoop $ mvn install 如果不想执行测试,请使用

java jsr命令_java 内使用 groovy 脚本,JSR-223(Scripting for the Ja...

在Java里需要用到 动态脚本的地方,可以使用groovy,比较方便。// require(url:'https://scripting.dev.java.net', jar:'groovy-engine.jar')import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;public class CalcMa...

weixin_30335379的博客 684

别再只画GO图了!用R语言+Perl脚本搞定单细胞KEGG富集分析与圈图(附完整代码)

本文详细介绍了如何利用R语言和Perl脚本实现单细胞KEGG富集分析全流程,从基因ID转换到专业圈图可视化。通过对比KEGG与GO分析的互补价值,提供完整的代码实现和优化技巧,帮助研究者高效完成单细胞测序数据的通路分析,并生成高质量的圈图展示结果。

weixin_28694169的博客 405

惯性导航原理(九)-INS的初始对准-初始姿态确定+双矢量定姿

文章目录INS的初始对准INS初始化静基座/静态粗对准静态粗对准—加速度计调平原理加速度计调平静态粗对准—陀螺罗盘思考初始对准的影响因素双矢量定姿原理静态解析粗对准—双矢量定姿静态解析粗对准(续)其它初始对准方法精对准动对准 INS的初始对准 INS的初始对准为初始化的一部分 INS初始化 初始位置: 给定(INS没有初始位置确定的能力,例如从GPS ) 初始速度: 零(静止状态)或给定 初始姿态: 初始对准(INS有能力自己测资态) 粗对准vs. 精对准 静止状态vs. 运动状态 重要性: 失之毫厘,谬

十八与她的博客 1万+

Java之戳中痛点 - (1)易变业务使用脚本语言编写

脚本语言的3大特征: 1、灵活:脚本语言一般是动态类型,可以不声明变量类型直接使用,也可以在运行期改变类型;2、便捷:脚本语言是解释性语言,在运行期变更非常方便,而不用重启服务3、简单:脚本语言语法比较简单,易学 另外:java6以上默认支持JavaScript Java SE6加入了对JSR223的实现, JSR223旨在定义一个统一的规范,使得java应用程序可以通过一套固定的接口...

weixin_33836223的博客 81

声纹识别实战:用Python从零搭建一个简易声纹验证系统(附完整代码)

本文是一份详细的声纹识别实战指南,教你使用Python从零搭建一个简易的声纹验证系统。文章涵盖了从音频采集、预处理、MFCC特征提取,到基于高斯混合模型(GMM)的建模与验证全流程,并提供了完整的代码实现,帮助开发者快速掌握这项生物特征识别核心技术。

ik6789012的博客 234

Java - JSR223规范解读_在JVM上实现多语言支持

JSR223(Java Specification Request 223),也称为 Scripting for the Java Platform,是一个Java平台的标准接口,旨在让Java应用程序能够灵活地集成和执行脚本语言。它定义了一种可以在Java应用中嵌入不同脚本语言的统一接口,允许Java程序调用、执行脚本,并且支持将Java对象传递到脚本语言中。Groovy是一个基于Java平台的动态语言,它简洁、表达力强,并且与Java兼容性极高。

小工匠 5390

HTML5+CSS3+JS小实例:焦点图波浪切换动画特效

实例:焦点图波浪切换动画特效。字体图标库:Font Awesome。技术栈:HTML+CSS+JS。

艾恩小灰灰的博客 909

华为OD机试 - 物流仓储多维度成本利润综合查询系统 - 二维数组(Python/JS/C/C++ 新系统 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。某物流企业在全国多个仓库开展仓储业务,需要对不同仓库、不同时段的入库成本、出库收入和库存损耗进行综合统计分析,用于生成 日报、周报和月报。字段说明及取值范围如下:warehouses: int[] 扁平化数组 [w0d0in, w0d0out,

学Java,找哪吒 309

Java动态语言标准JSR-223

JSR223规范最初在Java6平台被提出,旨在提供一种统一的方式,使Java应用程序能够嵌入和执行多种脚本语言,可以用一致的形式在JVM上执行一些脚本语言。通过JSR223,开发者可以在Java应用程序中灵活地引入脚本语言,从而增强应用程序的功能和灵活性。ScriptEngine是Java中用于解释脚本的接口,它可以通过javax.script包来使用。

老码农的博客 1891

vscode的launch:program ‘‘ does not exist

如图 一般是由于launch.json文件没有配置好的缘故。在右下角的ADD configuration如选第二个登录: 看到program这一栏,这一栏很重要,一般是选择你CMakelist,编译出来的可执行文件 看我CMakelist, 我生成的可执行文件是test_,所以路径可以这样输入: 我在之前cmake的时候已经有了test_这个文件了 然后就可以运...

狂小虎/Anthony Dave的博客 KuangXiaoHu's Blogs 5万+

JSR223

是的缩写,它的全称是。简单来说,JSR223 是。

gshlj的博客 828

机器人控制基础:伺服驱动电机 PID 参数自适应控制的实现方法及研究

伺服电机PID参数自适应控制技术研究 摘要:针对伺服驱动电机在动态负载工况下传统PID控制性能下降的问题,本文研究了多种自适应控制方法。通过分析6种主流技术(包括模型参考自适应、模糊逻辑、神经网络等)的原理、实现步骤及适用场景,揭示了负载感知精度、参数调节实时性和系统稳定性三大技术难点,并提出了相应解决方案。以模糊自适应PID为例的实验验证表明,该技术能有效提升伺服系统在变负载条件下的控制性能。研究为工业应用中伺服电机的精确控制提供了重要参考。

start_up_go的博客 828

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

jsr223 java_jsr223-Java中的script引擎接口

JDK1.6开始,Java引入了jsr223,就是可以用一致的形式在JVM上执行一些脚本语言,如js。先来一个简单的例子以对在jvm上运行脚本有个初步的认识。import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;public class TestScript1 {public static void mai...

weixin_28698129的博客 1367

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

javax.script包探秘 javascript与java交互执行

这个包用来和JavaScript进行互操作,比如Java类可以调用JavaScript中的方法,而JS也可调用 JAVA中的方法. 1、可用的脚本引擎 Java 6提供对执行脚本语言的支持,这个支持来自于JSR223规范,对应的包是javax.script。默认情况下,Java 6只支持javascript脚本,它底层的实现是Mozilla Rhino,它是个纯Java的jav

一杯咖啡 5541

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Jvm上如何运行其他语言?JSR223规范最详细讲解

在Java的平台里,其实是可以执行其他的语言的。包括且不仅限于jvm发展出来的语言。有的同学可能会说,在java项目里执行其他语言,这不吃饱了撑着么,java体系那么庞大,各种工具一应俱全,放着好好的java不写,还要去执行其他语言干嘛。写java的都知道,java是需要事先编译的,这意味着你很难去在运行中改变编译好的class信息,除非你用字节码等技术栈,但是这也是需要很大的成本的。要想在运行中很方便的改变业务逻辑,其实用java去执行其他的脚本语言是一个好办法。况且有的脚本语言有着比java更简洁的语法

BASK2311的博客 1229

jsr223 java_JSR223 Java使用脚本引擎动态修改业务逻辑

本文来自图灵社区 @fairjm 转截请注明出处偶尔会有一些业务需求是需要在动态改变线上代码的行为.一般的做法是使用个配置文件,存在数据库或者redis等存储中,程序动态获取之后解析并根据配置进行相应的操作.在配置不复杂的情况下这样的做法能够满足需求.但如果配置很复杂,或者配置的规则很多,那么解析配置并运行就变成了一件很麻烦的事情.可能会引入一些解析器,或者Criteria这样的类.如果这样,那是...

weixin_39581716的博客 357

Jvm 上如何运行其他语言?JSR223 规范最详细讲解

在 Java 的平台里,其实是可以执行其他的语言的。包括且不仅限于 jvm 发展出来的语言。有的同学可能会说,在 java 项目里执行其他语言,这不吃饱了撑着么,java 体系那么庞大,各种工具一应俱全,放着好好的 java 不写,还要去执行其他语言干嘛。写 java 的都知道,java 是需要事先编译的,这意味着你很难去在运行中改变编译好的 class 信息,除非你用字节码等技术栈,但是这也是需要很大的成本的。要想在运行中很方便的改变业务逻辑,其实用 java 去执行其他的脚本语言是一个好办法。况且有的脚

u012181546的博客 420

java jsr 365_Java 5.0中实现JSR-223的方法

最新的Java主版本(Java SE 6,又称Mustang)现在正处于beta版本阶段。虽然该版本并不像Java5的更新那么多,但是它确实有一些有趣的新特性。毋庸置疑,其中的一个就是对脚本编写语言的支持。诸如PHP、Ruby、JavaScript、Python(或Jython)之类的脚本编写语言被广泛应用于许多领域,并由于其灵活性和简单性而大受欢迎。由于脚本是被解释而不是被编译的,所以可以轻松地...

weixin_39609051的博客 320

jsr223 java_使用JSR223集成jython到Java中

packagetest.jsr223;importjava.io.*;importjava.util.*;importjavax.script.*;publicclassjsr223{privateScriptEngineengine;staticprivateMapscriptMap=null;staticprivatevoidcreateMaps(){if(scriptMap==null...

weixin_39890517的博客 259
上一篇: ubuntu linux 更换 阿里云 软件源 安装 svn
下一篇: 摘要算法加密tomcat登录密码(加盐,随机盐值)
conquer0715
博客等级 码龄18年 73粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值