【janino】janino 加载自定义函数报错 CompileException xxx cannot be invoked in static context

在这里插入图片描述

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) 

就好了。

原创文章 1444 获赞 480 访问量 175万+

猜你喜欢

转载自blog.csdn.net/qq_21383435/article/details/106114066