精华内容
下载资源
问答
  • Java 执行字符串代码的方案有很多中,一般情况下我们计算字符串表达式的场景有: 计算逻辑判断式,并返回判断结果(true,false) 计算表达式值,一般返回结果为数值 根据条件简单拼接字符串,返回结果为拼接文本 我们...

    Java 计算字符串表达式(字符串代码)

    Java 执行字符串代码的方案有很多中,一般情况下我们计算字符串表达式的场景有:

    • 计算逻辑判断式,并返回判断结果(true,false)
    • 计算表达式值,一般返回结果为数值
    • 根据条件简单拼接字符串,返回结果为拼接文本

    我们可以使用 Java 内部自带的 JavaScript 引擎实现上述效果。

    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    
    class Scratch {
        public static void main(String[] args) throws ScriptException {
            ScriptEngineManager manager = new ScriptEngineManager();
            // 创建脚本执行引擎
            ScriptEngine engine = manager.getEngineByName("js");
            // 执行逻辑判断
            final boolean ret = (boolean) engine.eval("1 == 2");
            System.out.println(ret);
        }
    }
    

    工具: Hutool

    当然,在通常情况下,我们不希望管 ScriptEngineManager 或者 ScriptEngine 什么鬼,只是希望能够计算一个字符串表达式的结果,这里强烈推荐在项目中引入工具包:Hutool。通过这个工具包,我们可以不用管上述两个东西是什么,只需要关注我们的字符串表达式,并且确保表达式的语法符合 JavaScript 语法即可,Hutool文档

    Maven 引入工具包坐标:

    <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.5.9</version>
    </dependency>
    

    代码中执行:

    String ret = (String) ScriptUtil.eval("'Hello World'");
    // 在执行 js 脚本时,不要使用 return 返回结果,否则会报  Invalid return statement 异常
    // 如果想要返回结果,可以直接在脚本末尾给出该变量
    System.out.println(ret);// Hello World
    

    即可获取到表达式执行结果。

    展开全文
  • Java实现字符串转换成可执行代码的方法发布于 2020-3-27|复制链接分享一篇关于Java实现字符串转换成可执行代码的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小妖过来看看吧使用commons的jexl可实现将...

    Java实现字符串转换成可执行代码的方法

    发布于 2020-3-27|

    复制链接

    分享一篇关于Java实现字符串转换成可执行代码的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小妖过来看看吧

    使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能:

    ```java

    import java.util.Map;

    import org.apache.commons.jexl2.Expression;

    import org.apache.commons.jexl2.JexlContext;

    import org.apache.commons.jexl2.JexlEngine;

    import org.apache.commons.jexl2.MapContext;

    /**

    * 动态加载方法

    *

    */

    public class DyMethodUtil {

    public static Object invokeMethod(String jexlExp,Map map){

    JexlEngine jexl=new JexlEngine();

    Expression e = jexl.createExpression(jexlExp);

    JexlContext jc = new MapContext();

    for(String key:map.keySet()){

    jc.set(key, map.get(key));

    }

    if(null==e.evaluate(jc)){

    return "";

    }

    return e.evaluate(jc);

    }

    }

    ```

    调用

    ```java

    Map map=new HashMap();

    map.put("testService",testService);

    map.put("person",person);

    String expression="testService.save(person)";

    DyMethodUtil.invokeMethod(expression,map);

    ```

    展开全文
  • JAVA 动态执行字符串代码

    千次阅读 2019-08-05 19:17:24
    用到的相关类: import org.springframework.context.expression.MapAccessor; import org.springframework.expression...要执行的方法时要有new才能够执行,如执行上面的字符串: new Test().exec(name) 方法。

    用到的相关类:

    import org.springframework.context.expression.MapAccessor;
    import org.springframework.expression.Expression;
    import org.springframework.expression.ExpressionParser;
    import org.springframework.expression.ParserContext;
    import org.springframework.expression.common.TemplateParserContext;
    import org.springframework.expression.spel.standard.SpelExpressionParser;
    import org.springframework.expression.spel.support.StandardEvaluationContext;

    其中:

    org.springframework.context.expression.MapAccessor 用于处理map数据

    org.springframework.expression.Expression 表达式接口由org.springframework.expression.ExpressionParser创建

    org.springframework.expression.ExpressionParser 表达式解析方案

    org.springframework.expression.ParserContext 表达式格式指定接口

    org.springframework.expression.common.TemplateParserContext 表达式格式实现类,即ParserContext的实现类

    org.springframework.expression.spel.standard.SpelExpressionParser 用于生成表达式解析方案

    org.springframework.expression.spel.support.StandardEvaluationContext 用于处理表达式数据

    具体代码如下:

    
    package com.service.impl;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.context.expression.MapAccessor;
    import org.springframework.expression.Expression;
    import org.springframework.expression.ExpressionParser;
    import org.springframework.expression.ParserContext;
    import org.springframework.expression.common.TemplateParserContext;
    import org.springframework.expression.spel.standard.SpelExpressionParser;
    import org.springframework.expression.spel.support.StandardEvaluationContext;
    
    
    
    public class ExpressServiceImpl {
    
    	private static final Logger log = LoggerFactory.getLogger(ExpressServiceImpl.class);
    
    	private ExpressionParser spelExpressionParser;
    
    	private ParserContext parserContext;
    	// 表达式解析上下文
    	private StandardEvaluationContext evaluationContext;
    
    	public static enum ExpressType {
    		/**
    		 * ${}表达式格式
    		 */
    		TYPE_FIRST,
    		/**
    		 * #{}表达式格式
    		 */
    		TYPE_SECOND
    	}
    
    	private static final String PRE_TYPE_1 = "${";
    	private static final String PRE_TYPE_2 = "#{";
    	private static final String SUF_STR = "}";
    
    	private ExpressServiceImpl(String pre, String suf) {
    		spelExpressionParser = new SpelExpressionParser();
    		log.debug("表达式前缀={},表达式后缀={}", pre, suf);
    		evaluationContext = new StandardEvaluationContext();
    		// 增加map解析方案
    		evaluationContext.addPropertyAccessor(new MapAccessor());
    		parserContext = new TemplateParserContext(pre, suf);
    	}
    
    	/**
    	 * 
    	 * <p>
    	 * 创建表达式处理服务对象 默认为创建#{}格式表达式 通过ExpressType指定表达式格式,现有两种${}和#{}
    	 * </p>
    	 *
    	 *
    	 * @param type
    	 *            表达式格式类型
    	 * @return 表达式解析对象
    	 */
    	public static ExpressServiceImpl createExpressService(ExpressType type) {
    		if (type == ExpressType.TYPE_FIRST) {
    			log.debug("生成表达式,表达式前缀={}", PRE_TYPE_1);
    			return new ExpressServiceImpl(PRE_TYPE_1, SUF_STR);
    		} else {
    			return new ExpressServiceImpl(PRE_TYPE_2, SUF_STR);
    		}
    
    	}
    
    	public Object expressParse(String express, Object data) throws Exception {
    		log.debug("解析表达式信息={}", express);
    		Expression expression = spelExpressionParser.parseExpression(express, this.parserContext);
    	
    		return expression.getValue(evaluationContext, data);
    	}
    
    
    }
    

    执行动态代码调用:

    public class Test {
    
    	public String exec(String para) {
    		return para;
    	}
    	
    	public static void main(String[] args) {
    		HashMap<String,String> map = new HashMap<>();
    		map.put("name","12");
    		map.put("mobile","13035353526");
    		ExpressService express = ExpressServiceImpl.createExpressService(null);
    		try {
    			System.out.println("mobile="+express.expressParse("#{new Test().exec(mobile)}", map));
    			System.out.println("name="+express.expressParse("#{new Test().exec(name)}", map));
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }

    注意:

    要执行的方法时要有new才能够执行,如执行上面的字符串: new Test().exec(name) 方法。

    展开全文
  • 使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能:import java.util.Map;import org.apache.commons.jexl2.Expression;import org.apache.commons.jexl2.JexlContext;import org....

    使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能:

    import java.util.Map;

    import org.apache.commons.jexl2.Expression;

    import org.apache.commons.jexl2.JexlContext;

    import org.apache.commons.jexl2.JexlEngine;

    import org.apache.commons.jexl2.MapContext;

    /**

    * 动态加载方法

    *

    */

    public class DyMethodUtil {

    public static Object invokeMethod(String jexlExp,Map map){

    JexlEngine jexl=new JexlEngine();

    Expression e = jexl.createExpression(jexlExp);

    JexlContext jc = new MapContext();

    for(String key:map.keySet()){

    jc.set(key, map.get(key));

    }

    if(null==e.evaluate(jc)){

    return "";

    }

    return e.evaluate(jc);

    }

    }

    调用

    Map map=new HashMap();

    map.put("testService",testService);

    map.put("person",person);

    String expression="testService.save(person)";

    DyMethodUtil.invokeMethod(expression,map);

    以上这篇Java实现字符串转换成可执行代码的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    展开全文
  • 使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能:import java.util.Map;import org.apache.commons.jexl2.Expression;import org.apache.commons.jexl2.JexlContext;import org....
  • 今天小编就为大家分享一篇java代码执行字符串中的逻辑运算方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能:import java.util.Map;import org.apache.commons.jexl2.Expression;import org.apache.commons.jexl2.JexlContext;import org....
  • Java实现字符串转换成可执行代码的方法发布于 2020-3-27|复制链接分享一篇关于Java实现字符串转换成可执行代码的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小妖过来看看吧使用commons的jexl可实现将...
  • 今天小编就为大家分享一篇Java实现字符串转换成可执行代码的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • =等比较符号,由客户选择,由于不想使用繁琐的switch/case,以及不想日后需求变动导致的比较符增加而改动代码,便想办法将表达式拼接成字符串,再代码执行得到比较结果。 参考原博客:...
  • 使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能:import java.util.Map;import org.apache.commons.jexl2.Expression;import org.apache.commons.jexl2.JexlContext;import org....
  • 在实现执行字符串中的运算公式时,采用了如下所示的代码: public static String StringfinalResult (String original) { try { String temp = (String)jse.eval(original); return ...
  • java字符串转换成可执行代码 转载于:https://www.cnblogs.com/liang-zisong/p/8426582.html
  • Java实现字符串转换成可执行代码

    千次阅读 2016-06-30 16:26:50
    Java实现字符串转换成可执行代码 使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能: import java.util.Map;import org.apache.commons.jexl2.Expression; import org.apache....
  • 使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能: Java代码 importjava.util.Map; importorg.apache.commo...
  • java执行字符串数学表达式 ScriptEngine

    千次阅读 2015-05-25 13:25:46
    今天遇到了一个需要将数据库中保存的表达式,替换其中的字符,并计算出值,java是不能...但是:遇到 "(3+5-(2-4)*2)/24" 字符串的格式,就不能使用了  java是无法解决,但是javaScript中有一个eval函数是可以
  • 一,引入jar包, <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-jexl --><dependency> <groupId>org.apache.commons</groupId>...commons-jexl<...
  • varpath=require('path');varfs=require('fs');varvm=require('vm');varos=require('os');/***格式化缩进的个数*/functiontoIndent(indent){vars=[];for(vari=0;...}/***将数组对象转换成原始字符串*/fu...
  • varpath=require('path');varfs=require('fs');varvm=require('vm');varos=require('os');/***格式化缩进的个数*/functiontoIndent(indent){vars=[];for(vari=0;...}/***将数组对象转换成原始字符串*/fu...
  • Download.java:244行的代码:text=text.replaceAll("","");出错信息:Exceptioninthread"Thread-1"java.lang.OutOfMemoryError:Javaheapspaceatjava.ut...Download.java:244行的代码:text=text.replaceAll("","");...
  • 使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能:import java.util.map;import org.apache.commons.jexl2.expression;import org.apache.commons.jexl2.jexlcontext;import org....
  • java代码执行字符串中的逻辑运算

    千次阅读 2017-05-19 18:01:02
    * 去除空白字符和在负号'-'前加'0',便于后面的StringTokenizer * @param exp * @return */ private static String initExpress (String exp){ String reStr = null ; reStr = exp.replaceAll( "\\...
  • (一)数据格式(二)初始化//方式一String str;//先声明,后赋值//执行其他代码str = "赋值";...(三)常用操作5.3.1 split("指定字符")语法:String.split("指定字符"),指定字符如果是特殊字符串需要使用"\...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,182
精华内容 872
关键字:

java执行字符串代码

java 订阅