1.背景
代码如下
@Test
public void janinoPerformanceTest4() throws Exception {
String rule = "(inValues(appProtocol, \"http,https\") " +
"&& inValues(direction, \"10,00\")) " +
"&& (destHostName != null) " +
"&& (eventCount != null) " +
"&& (bytesOut != null) " +
"&& (bytesIn != null)";
IExpressionEvaluator evaluator = CompilerFactoryFactory.getDefaultCompilerFactory().newExpressionEvaluator();
evaluator.setExpressionType(boolean.class);
evaluator.setExtendedClass(JaninoContainsIgnoreCaseFunction.class);
evaluator.setParameters(
new String[]{"appProtocol", "direction", "destHostName", "eventCount", "bytesOut", "bytesIn"},
new Class[]{String.class, String.class, String.class, String.class, String.class, String.class}
);
evaluator.cook(rule);
Object[] arguments = {"appProtocol" + i, "direction" + i,
"destHostName" + i, "eventCount" + i, "bytesOut" + i
, "bytesIn" + i};
Object res = evaluator.evaluate(arguments);
System.out.println(res);
}
自定义函数如下
package com.janino.demo.function;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class JaninoFunction {
private static Map<String, Set<String>> inMap = new ConcurrentHashMap<>();
public boolean inValues(String params, String target) {
Set<String> matchList = getOrCreate(params,false);
if(matchList.contains(target)){
return true;
}else {
return false;
}
}
private Set<String> getOrCreate(String param, boolean ignore) {
if(inMap.get(param) != null){
return inMap.get(param);
}
String[] splits = param.split(",");
Set<String> uniques = new HashSet<>();
if(splits.length > 0){
if(ignore){
uniques.addAll(Arrays.stream(splits).map(String::toLowerCase).collect(Collectors.toList()));
}else{
uniques.addAll(Arrays.asList(splits));
}
}
inMap.put(param,uniques);
return uniques;
}
}
报错如下
org.codehaus.commons.compiler.CompileException: Line 1, Column 11: Instance method "public boolean com.janino.demo.function.JaninoContainsIgnoreCaseFunction.inValues(java.lang.String, java.lang.String)" cannot be invoked in static context
at org.codehaus.janino.UnitCompiler.compileError(UnitCompiler.java:12124)
at org.codehaus.janino.UnitCompiler.compileGet2(UnitCompiler.java:5095)
at org.codehaus.janino.UnitCompiler.access$9100(UnitCompiler.java:215)
at org.codehaus.janino.UnitCompiler$16.visitMethodInvocation(UnitCompiler.java:4421)
at org.codehaus.janino.UnitCompiler$16.visitMethodInvocation(UnitCompiler.java:4394)
at org.codehaus.janino.Java$MethodInvocation.accept(Java.java:5062)
at org.codehaus.janino.UnitCompiler.compileGet(UnitCompiler.java:4394)
at org.codehaus.janino.UnitCompiler.compileGetValue(UnitCompiler.java:5575)
at org.codehaus.janino.UnitCompiler.compileBoolean2(UnitCompiler.java:3986)
at org.codehaus.janino.UnitCompiler.access$6300(UnitCompiler.java:215)
at org.codehaus.janino.UnitCompiler$14.visitMethodInvocation(UnitCompiler.java:3961)
at org.codehaus.janino.UnitCompiler$14.visitMethodInvocation(UnitCompiler.java:3933)
at org.codehaus.janino.Java$MethodInvocation.accept(Java.java:5062)
at org.codehaus.janino.UnitCompiler.compileBoolean(UnitCompiler.java:3933)
at org.codehaus.janino.UnitCompiler.compileBoolean2(UnitCompiler.java:4072)
at org.codehaus.janino.UnitCompiler.access$6600(UnitCompiler.java:215)
at org.codehaus.janino.UnitCompiler$14.visitBinaryOperation(UnitCompiler.java:3955)
at org.codehaus.janino.UnitCompiler$14.visitBinaryOperation(UnitCompiler.java:3933)
at org.codehaus.janino.Java$BinaryOperation.accept(Java.java:4853)
at org.codehaus.janino.UnitCompiler.compileBoolean(UnitCompiler.java:3933)
at org.codehaus.janino.UnitCompiler.compileBoolean2(UnitCompiler.java:4249)
at org.codehaus.janino.UnitCompiler.access$6400(UnitCompiler.java:215)
at org.codehaus.janino.UnitCompiler$14$1.visitParenthesizedExpression(UnitCompiler.java:3946)
at org.codehaus.janino.UnitCompiler$14$1.visitParenthesizedExpression(UnitCompiler.java:3937)
at org.codehaus.janino.Java$ParenthesizedExpression.accept(Java.java:4913)
at org.codehaus.janino.UnitCompiler$14.visitLvalue(UnitCompiler.java:3937)
at org.codehaus.janino.UnitCompiler$14.visitLvalue(UnitCompiler.java:3933)
at org.codehaus.janino.Java$Lvalue.accept(Java.java:4137)
at org.codehaus.janino.UnitCompiler.compileBoolean(UnitCompiler.java:3933)
at org.codehaus.janino.UnitCompiler.compileBoolean2(UnitCompiler.java:4072)
at org.codehaus.janino.UnitCompiler.access$6600(UnitCompiler.java:215)
at org.codehaus.janino.UnitCompiler$14.visitBinaryOperation(UnitCompiler.java:3955)
这是因为里面的方法不是静态类,改成
public static boolean inValues(String params, String target)
就好了。