`

java脚本语言之eval功能

    博客分类:
  • JAVA
阅读更多

最近在项目中需要利用到类似javascript的eval函数的功能来执行一个String表达式,例如表达式为:

 

 String expression= "((parm1<456)||(time*time>(modifyTime*5000-200))) && (((money <10000||money*money>=100000)))";

其中有几个变量: parm1    time    modifyTime   money。

然后找到了几个脚本语言来实现这一功能。下面我为大家一一介绍。

首先是很老资格的Beanshell

Beanshell

import bsh.EvalError;
import bsh.Interpreter;
import bsh.ParseException;
import bsh.TargetError;

public class BeanShellEngine {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	   
	    String ruleStirng= "((parm1<456)||(time*time>(modifyTime*5000-200))) && (((money <10000||money*money>=100000)))";
	  
	    Interpreter in = new Interpreter();
	    Object res=null;
		try {
			
				in.set("parm1",123);
				in.set("time", 456);
				in.set("modifyTime",789);
				in.set("money",123456);
				res= in.eval(ruleStirng);
	
			      System.out.println(res);
	

		} catch (ParseException pe) {
		pe.printStackTrace();
		} catch (TargetError te) {
		System.out.println(te.getErrorLineNumber()
		+ "" + te.getErrorText());
		} catch (EvalError ee) {
		ee.printStackTrace();
	}
	}
}

 接着是Groovy

Groovy

import groovy.lang.GroovyShell;
import java.io.IOException;
import org.codehaus.groovy.control.CompilationFailedException;

public class GroovyEngine {

	public static void main(String[] args) {
		GroovyShell shell = new GroovyShell();
		String ruleStirng= "((parm1<456)||(time<(modifyTime-200))) && (money >10000)";
		
		try {
			Object result=null;
			
			shell.setProperty("money",123);
			shell.setProperty("time", 456);
			shell.setProperty("modifyTime",789);
			shell.setProperty("parm1",123456);
			 result = shell.evaluate(ruleStirng);
			System.out.println(result);
		} catch (CompilationFailedException cfe) {
			System.out.println("Syntax not correct " + cfe);
		}
	}
}

 接着是IK(javaeye上一牛人写的 可以搜索IK表达式 IK分词等)

import java.util.ArrayList;
import java.util.List;

import org.wltea.expression.ExpressionEvaluator;
import org.wltea.expression.datameta.Variable;

public class IkEngine {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//定义表达式
		String ruleStirng= "((parm1<456)||(time<(modifyTime-200))) && (money >10000)";
		
		
		List<Variable> variables = new ArrayList<Variable>();
		Object result=null;
		
		variables.add(Variable.createVariable("money"123));
		variables.add(Variable.createVariable("modifyTime",456));
		variables.add(Variable.createVariable("time",789));
		variables.add(Variable.createVariable("parm1",123456));
		//执行表达式
		result = ExpressionEvaluator.evaluate(ruleStirng, variables);
	
		
		System.out.println("Result = " + result);		

	}

}

 接着是JPython

import org.python.util.PythonInterpreter;

public class PythonEngine {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		PythonInterpreter in = new PythonInterpreter();
		String ruleStirng= "((parm1<456)|(time<(modifyTime-200)))&(money >10000)";

		 Object result =null;
		
				in.set("money",123);
				in.set("time",456);
				in.set("modifyTime",789);
				in.set("parm1",123456);
				result=in.exec(ruleStirng);
		
			System.out.println(result);

	}

}
 

接着是Mvel(JBOSS RULE里使用的)

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import org.mvel2.MVEL;

public class MvelEngine {

          public static void main(String[] args) {
   
        	  String expression= "((parm1<456)||(time*time>(modifyTime*5000-200))) && (((money <10000||money*money>=100000)))";
        	
              Serializable compiled = MVEL.compileExpression(expression);

                Map vars = new HashMap();
         
                Object result =null;
  
    				vars.put("parm1",123);
    				vars.put("time",456);
    				vars.put("modifyTime",789);
    				vars.put("money",123456);
    				result=	MVEL.executeExpression(compiled, vars);
    			
              
                    System.out.println(result);
                         
          }
  

}

 接着是:Jruby (抱歉由于我对Ruby不感兴趣所以这个我没用只是下了jar)

 

接着是:rhinol(mozilla 开发的脚本语言)

import java.io.FileReader;
import java.io.IOException;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.JavaScriptException;
import org.mozilla.javascript.Scriptable;

public class ScriptEngine {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			Context cx = Context.enter();
			String ruleStirng= "((parm1<456)||(time<(modifyTime-200)))&&(money >10000)";
			
			Scriptable scope = cx.initStandardObjects();
			Object result =null;
			
			scope.put("money", scope,1);
			scope.put("time", scope,2);
			scope.put("modifyTime", scope,3);
			scope.put("parm1", scope,4);
			result= cx.evaluateString(
					scope,
					ruleStirng
					,"<cmd>", 1, null
					);
		
			System.out.println(result);
			} catch (JavaScriptException jse) {
			jse.printStackTrace();
			} finally {
			Context.exit();
			}
			}


}

分享到:
评论
2 楼 michaelzhouh 2014-02-19  
如果有一个public static String md5(String password){..},表达式包含这个md5("123456")咋个整呢?
1 楼 x007700x 2012-11-17  
好东东啊 

相关推荐

    java实现eval函数

    在Java中模拟`eval`功能的一个常见方法是通过使用Java Scripting API(JSR 223),它允许你在Java应用程序中嵌入和执行脚本语言,包括JavaScript。以下是一个简单的例子,展示了如何使用JSR 223来执行JavaScript代码...

    java调用脚本语言笔记(jython,jruby,groovy)

    Java作为企业级应用的首选平台,有时也需要与脚本语言进行交互,以实现动态配置、自动化测试或者快速原型开发等需求。本文将深入探讨如何在Java中调用三种流行的脚本语言:Jython、JRuby和Groovy。 ### Jython ...

    Java脚本教程(学习资料)

    总之,Java脚本教程涵盖了如何在Java应用程序中集成和执行脚本语言的各个方面,包括如何发现和实例化脚本引擎,以及如何与不同的脚本环境进行交互。通过学习这些内容,开发者可以更好地利用Java的多语言支持,提高...

    第 1 部分: 引入 Java 脚本 API

    【标题】:“第 1 部分: 引入 Java 脚本 API” Java 脚本 API,也称为 Java Scripting API,是Java平台标准版(Java SE)的一部分,它允许Java...通过这种方式,开发者可以利用脚本语言的灵活性来增强Java应用的功能。

    JAVA 脚本应用数据

    Java脚本应用数据是Java平台中使用脚本语言处理数据的一种技术。在Java中,你可以利用内置的ScriptEngine接口和相关的脚本引擎实现对不同脚本语言(如JavaScript、Groovy、Ruby等)的支持,从而在应用程序中进行动态...

    java脚本 快速学习

    Java脚本语言,通常指的是Java Scripting API (JSAPI) 或者是JavaScript,它是一种轻量级、解释型的编程语言,广泛应用于Web开发中,为网页提供动态交互功能。虽然名字相似,但它与Java语言在语法和用途上有所不同。...

    Java脚本言程序手册语员

    Java脚本API设计用于在Java应用程序中嵌入脚本引擎的能力,无需依赖具体的脚本语言。这一API的核心价值在于提供了一种灵活的方式,使得开发者能够根据实际需求选择最适合项目的脚本语言,同时也允许最终用户根据个人...

    脚本化Java

    在Java 6中,脚本化功能的核心在于`javax.script`包,它提供了一个通用接口,使得不同脚本语言可以在Java应用程序中无缝集成。`ScriptEngine`是这个包中的核心类,代表一个脚本引擎实例,可以执行脚本并处理脚本的...

    Java脚本引擎1

    Java脚本引擎1 在Java中,为了与各种脚本语言进行交互,如JavaScript,Java提供了ScriptEngine API,这是Java Scripting API的一部分。这个API允许Java应用程序执行动态脚本,或者利用脚本语言的能力来增强Java应用...

    在Java中运行Perl脚本 JERL

    Java是一种广泛使用的面向对象的编程语言,而Perl则是一种功能强大的脚本语言,常用于文本处理和系统管理任务。在某些场景下,我们可能需要在Java应用程序中调用Perl脚本来执行特定的功能。JERL(Java-Embedding for...

    java脚本编程

    ### Java脚本编程知识点详解 #### 一、Java与JavaScript的区别 尽管“Java脚本编程”这个表述在日常交流中可能会被提及,但实际上...对于希望快速适应Java脚本语言的学习者来说,理解这些概念是非常重要的第一步。

    在java中利用动态编译实现eval

    在Java中,`eval`功能通常不直接提供,因为与脚本语言相比,Java是一种静态类型的语言,强调安全和性能。然而,通过使用Java的反射API和动态编译技术,可以实现类似的功能。动态编译是指在程序运行时将源代码编译成...

    JDK13-java-scripting-programmers-guide.pdf

    Java Scripting Programmer's Guide是Java Platform, Standard Edition的组件之一,提供了Java脚本引擎的编程指南。该指南详细介绍了Java脚本引擎的架构、配置、编程模型、安全机制等方面的内容。 Java脚本引擎架构...

    Java 8 Nashorn 脚本引擎

    2. `jsr223`接口:这个接口为脚本语言提供了Java Scripting API,使得Java程序能够调用JavaScript函数或对象就像它们是Java方法一样。 Nashorn引擎的一个关键特性是它可以与Java对象互操作。Java对象可以通过`...

    java运行js脚本引擎-----rhino

    Rhino的核心是ECMAScript的实现,这是一种标准化的脚本语言,JavaScript就是基于此标准的一种方言。ECMAScript提供了动态类型、函数式编程和原型继承等特性,使得Rhino成为Java开发者在服务器端或嵌入式环境执行...

    为Java应用程序加入脚本引擎

    脚本语言通常比传统编程语言更为简洁易懂,这使得非专业程序员也能够利用脚本语言来扩展应用程序的功能。目前,网络上有多种流行的脚本语言,包括TCL、Perl、JavaScript、Python等,这些语言中很多都有对应的Java...

Global site tag (gtag.js) - Google Analytics