Atitit java 动态表达式调用类方法 最佳实践 Ognl 新来的MVE Beanshell Groovy 目录 1.1. Beanshell 可以的 1 1.2. MVEL 好像
Atitit java 动态表达式调用类方法 最佳实践 Ognl 新来的MVE Beanshell Groovy
目录
老牌的Ognl(老到网站都找不到了) 新来的MVEL 国产的Aviator 目前最快的JSEL:JSEL测试表达式
比groovy更加的语法兼容java
import bsh.EvalError;
import bsh.Interpreter;
import bsh.NameSpace;
import javassist.expr.NewArray;
public class bshBbeanshellTestV2t33 {
public void methDync() {
System.out.println("--meth dync");
}
///bookmarksHtmlEverythingIndexPrj/src/bshBbeanshellTestV2t33.java
public static void main(String[] args) throws EvalError, FileNotFoundException, IOException {
//t();
Interpreter i = new Interpreter(); // Construct an interpreter
System.out.println(i.eval(" new bshBbeanshellTestV2t33().meth() "));
}
3. 对静态变量的访问
在OGNL表达式当中也可以访问静态变量或者调用静态方法,格式如@[class]@[field/method()]。具体代码如下:
4. 方法的调用
如果需要调用Root对象或者上下文对象当中的方法也可以使用.+方法的方式来调用。甚至可以传入参数。代码如下:
import java.util.Map;
import java.util.Set;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.script.SimpleScriptContext;
import org.codehaus.groovy.ant.Groovy;
import com.google.common.collect.Maps;
///bookmarksHtmlEverythingIndexPrj/src/groovyDemo.java
public class groovyDemo {
public void methDync() {
System.out.println("--meth dync");
}
public static void main(String[] args) throws ScriptException {
Groovy groovy = new Groovy();
System.out.println(execute("new groovyDemo().methDync();return 1", Maps.newConcurrentMap()));
;
}
public static Object execute(String scriptText, Map<?, ?> context) throws ScriptException {
Compilable engine; // 获取groovy编译类
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engineByName = manager.getEngineByName("groovy");
engine = (Compilable) engineByName;
// org.codehaus.groovy.jsr223.GroovyScriptEngineImpl
// apache-groovy-sdk-2.5.6\groovy-2.5.6\lib\groovy-jsr223-2.5.6.jar
CompiledScript script = engine.compile(scriptText);
// 这个地方需要使用缓存,达到编译一次,多次执行。
ScriptContext scriptContext = new SimpleScriptContext();
//
return script.eval();
}
// Set<?> its = context.entrySet(); // 上下文参数
// for (Object o : its) {
// // @SuppressWarnings("rawtypes")
// // Entry entry = (Entry)o;
scriptContext.setAttribute( LangUtil.getString(entry.getKey()),
entry.getValue(), ScriptContext.ENGINE_SCOPE); //copy到groovy执行环境上下文
// }
// return script.eval(scriptContext); // 执行groovy脚本}
// ScriptContext defaultCtx = ((ScriptEngine) engine).getContext();
}
OGNL表达式介绍 - 一步一个脚印,坚持 - 博客园.htm