`

Java平台的内嵌脚本支持JSR223以及commons-jexl简单使用

阅读更多

前言

JDK6加入对JSR233-Java平台脚本的支持(JSR 223: Scripting for the Java Platform ),可以用来在Java程序中调用脚本。

 

1.支持的脚本类型

 

import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import java.util.List;

public class TestSupport {
    public static void main(String[] args) {
        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
        List<ScriptEngineFactory> engineFactories = scriptEngineManager.getEngineFactories();
        if (engineFactories.size() == 0) {
            System.out.println("本JVM尚不支持任何脚本引擎");
            return;
        }

        System.out.println("本JVM支持的脚本引擎有:");
        for (ScriptEngineFactory engineFactory : engineFactories) {
            System.out.println("引擎名称:" + engineFactory.getEngineName());
            System.out.println("\t可被ScriptEngineManager识别的名称:" + engineFactory.getNames());
            System.out.println("\t该引擎支持的脚本语言名称:" + engineFactory.getLanguageName());
            System.out.println("\t是否线程安全:" + engineFactory.getParameter("THREADING"));
        }
    }
}

 

 

 

2.DEMO

 

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class TestScript1 {
    public static void main(String[] args) throws Exception {
        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
        ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("javascript");
        String exp = "c=a+b;if(c<0){'负数'}else if(c==0){'零'}else{c};";
        scriptEngine.put("a", Math.random()*(-10));
        scriptEngine.put("b", Math.random()*10);
        Object result = scriptEngine.eval(exp);
        System.out.println(exp + " === " + result);
    }
}

 

 

2.commons-jexl

Apache commons-jexl是基于JSR233的扩展库,只需添加依赖就可以使用。

(1)Maven Dependency

 

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-jexl</artifactId>
    <version>2.1.1</version>
</dependency>

 

 

(2)DEMO

import java.util.Date;

public class Pojo {
    private String str;
    private Integer inte;
    private Boolean bool;
    private Date date;

    public Pojo(String str, Integer inte, Boolean bool, Date date) {
        this.str = str;
        this.inte = inte;
        this.bool = bool;
        this.date = date;
    }

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    public Integer getInte() {
        return inte;
    }

    public void setInte(Integer inte) {
        this.inte = inte;
    }

    public Boolean getBool() {
        return bool;
    }

    public void setBool(Boolean bool) {
        this.bool = bool;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

 

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.jexl2.Expression;
import org.apache.commons.jexl2.JexlContext;
import org.apache.commons.jexl2.JexlEngine;
import org.apache.commons.jexl2.MapContext;

import java.util.Date;
import java.util.List;
import java.util.Map;

public class TestJexl {
    public static void main(String[] args) {
        /**
         * 新建或取回JexlEngine
         */

        JexlEngine jexl = new JexlEngine();

        /**
         * 初始化一个JexlContext对象,它代表一个执行JEXL表达式的上下文环境
         */
        JexlContext context = new MapContext();

        // 准备并设置JEXL表达式上下文环境
        Pojo pojo = new Pojo("Pojo", 123, true, new Date());
        List<String> list = Lists.newArrayList("a1", "", "c3");
        Map<String, Object> map = Maps.newHashMap();
        map.put("key", "value");
        map.put("pojo", pojo);

        context.set("pojo", pojo);
        context.set("list", list);
        context.set("map", map);

        // 准备表达式
        List<String> jexlExps = Lists.newArrayList("pojo.str", "pojo.inte", "pojo.bool", "pojo.date"
                , "size(list)", "list[0].length()", "list[0].toUpperCase()", "empty(list[1])"
                , "map['key']", "map['pojo'].str");

        // 执行表达式
        for (String jexlExp : jexlExps) {
            // 建立表达式对象 Create expression object
            Expression expression = jexl.createExpression(jexlExp);
            // 传入上下文环境并执行
            Object obj = expression.evaluate(context);
            System.out.println(expression.getExpression() + " = " + obj);
        }

    }
}

 

 

 

 

 

 

 

0
0
分享到:
评论

相关推荐

    jsr311-api-1.1.1-API文档-中文版.zip

    标签:javax、jsr311、api、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心...

    xfire-jsr181-api-1.0-M1.jar,xfire-jsr181-api-1.0-M1.jar

    webservice中用到的jar,xfire-jsr181-api-1.0-M1.jar,xfire-jsr181-api-1.0-M1.jar

    jackson-datatype-jsr310-2.12.5-API文档-中文版.zip

    标签:fasterxml、jackson、datatype、jsr310、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...

    23 Spring Core参数校验之JSR303_JSR-349注解-慕课专栏1

    以下是一个简单的例子,展示如何使用JSR 303/349/380注解进行参数校验: ```java public class User { @NotNull(message = "名称不能为空") private String name; @Min(value = 18, message = "年龄不能小于18岁...

    jsr311-api-1.1.1-API文档-中英对照版.zip

    标签:javax、jsr311、api、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...

    jackson-datatype-jsr310-2.11.4-API文档-中英对照版.zip

    标签:fasterxml、jackson、datatype、jsr310、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和...

    jsr305-3.0.2-API文档-中英对照版.zip

    标签:findbugs、jsr305、google、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译...

    jackson-datatype-jsr310-2.13.1-API文档-中文版.zip

    标签:jackson、jsr310、datatype、fasterxml、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...

    jackson-datatype-jsr310-2.9.7-API文档-中英对照版.zip

    标签:jackson、jsr310、datatype、fasterxml、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变...

    jackson-datatype-jsr310-2.11.4-API文档-中文版.zip

    标签:fasterxml、jackson、datatype、jsr310、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...

    xfire-jsr181-api-1.0-实例化webservic

    标题 "xfire-jsr181-api-1.0-实例化webservic" 指的是使用XFire框架结合JSR 181规范来创建和实例化Web服务的过程。XFire是一款早期的Java Web服务实现,它提供了一种简单、高性能的方式来创建和消费SOAP服务。JSR ...

    jackson-datatype-jsr310-2.12.3-API文档-中文版.zip

    标签:fasterxml、jackson、datatype、jsr310、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...

    jackson-datatype-jsr310-2.9.7-API文档-中文版.zip

    标签:jackson、jsr310、datatype、fasterxml、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,...

    jsr305-3.0.2-API文档-中文版.zip

    标签:findbugs、jsr305、google、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...

    jackson-datatype-jsr310-2.9.5-API文档-中英对照版.zip

    标签:fasterxml、jackson、datatype、jsr310、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和...

    jsr173_api-1.0.jar

    jsr173_api-1.0.jar jsr173_api-1.0.jar

    jackson-datatype-jsr310-2.9.6-API文档-中英对照版.zip

    标签:fasterxml、jackson、datatype、jsr310、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和...

    jsr250-api-1.0源码

    总的来说,JSR 250 API 1.0 是Java EE平台中不可或缺的一部分,它提供的注解极大地简化了企业级应用的开发。通过学习和使用JSR 250,开发者可以更好地理解和实践依赖注入原则,编写出更加模块化、易于维护的代码。对...

    jackson-datatype-jsr310-2.13.1-API文档-中英对照版.zip

    标签:jackson、jsr310、datatype、fasterxml、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和...

    jsr-275-1.0-beta-2.jar

    java.lang.ClassNotFoundException: javax.measure.converter.ConversionException所需的jar

Global site tag (gtag.js) - Google Analytics