Mvel表达式的基础使⽤和⾃定义⽅法运⽤
Mvel是⼀种易于使⽤、灵活且强⼤的表达式解析器,语法与java有些相似,功能有点像是将我们的⾃然语⾔解析为计算机语⾔(个⼈通俗理解,不准确)。
基础使⽤
圣诞节哪天举个最简单的例⼦:大学宿舍排名
要判断 5 是否⼤于 2, 或者计算 5减2这种算术运算, 直接⽤下⾯代码中写法即可
import org.mvel2.MVEL;
import org.mvel2.ParrContext;订电影票
import java.io.Serializable;
/**
* Mvel测试
*
* @author: Danger
*/
public class MvelTest {
public static void main(String[] args) {
烟雨遥
System.out.println(MVEL.eval("5 > 2"));
System.out.println(MVEL.eval("5 - 2"));
Serializable expression = pileExpression("5 + 2");
Object result = uteExpression(expression);
System.out.println(result);
Object result2 = pileExpression("[1, 2, 3] contains 2"));
System.out.println(result2);
}
}
其中, pileExpression(string)是将表达式编译成mvel可执⾏的内容,然后通过uteExpression(expression)执⾏。
Mvel表达式是默认⽀持⼀些⽅法的,像是上⾯例⼦中⽤到算术运算、list的contains⽅法等,同时也⽀持⾃定义⽅法。
⾃定义⽅法
某些场景我们需要更复杂的运算或者处理逻辑,这时候可以使⽤⾃定义⽅法。
⼤致流程:
1. ⾃定义⽅法
2. 将⾃定义⽅法添加到Mvel的ParrContext中
3. 基于ParrContext环境 编译和执⾏Mvel表达式
代码如下:
/**
* ⽤户⾃定义⽅法
*
* @author: Danger
*/
public class UrFunction {
/**
* 字符串source 是否包含 target,忽略⼤⼩写
*
* @param source
* @param target
* @return boolean
*/
public static boolean containsIgnCa(String source, String target) { if (StringUtils.isEmpty(source) || StringUtils.isEmpty(target)) {
return fal;
}
if (UpperCa().UpperCa())) {
return true;
}
return fal;
}
}
import org.mvel2.MVEL;
import org.mvel2.ParrContext;
import java.io.Serializable;
import flect.Method;
/**
* Mvel编译
*
* @author: Danger
*/
public class MvelCompiler {
荞麦面好吃吗
private static final MvelCompiler instance = new MvelCompiler();
private static ParrContext context;
private MvelCompiler() {
context = new ParrContext();
// 将UrFunction类中的所有⽅法加载到context中
Method[] declaredMethods = DeclaredMethods();带春的成语
for (Method declaredMethod : declaredMethods) {
context.Name(), declaredMethod);
}
// 或者⽤下⾯这种⼀个个指定的⽅式加载到context中
// context.addImport("containsIgnCa", StaticMethod(UrFunction.class, "containsIgnCa", new Class[]{String.class, String.class})); }
public static MvelCompiler getInstance() {
return instance;说话结巴
}
public Serializable compile(String expression) {
if (StringUtils.isNotEmpty(expression)) {
pileExpression(expression, context);
}
return null;
}
}
测试验证:
/
**
* Mvel测试
*
* @author: Danger
*/
public class MvelTest {
班组简介public static void main(String[] args) {
ParrContext parrContext = new ParrContext();
parrContext.addImport("containsIgnCa", StaticMethod(UrFunction.class, "containsIgnCa", new Class[]{String.class, String.class})); Serializable expression1 = pileExpression("containsIgnCa('abc', 'BC')", parrContext);
Object result3 = uteExpression(expression1);
System.out.println(result3);
Object result4 = Instance().compile("containsIgnCa('abc', 'D')"));
System.out.println(result4);
}
}
以上。