在BeanShell的帮助下,在嵌入式代码中调用方法

时间:2016-01-12 09:59:18

标签: java beanshell

我需要在我的代码中调用一些java代码。我使用BeanShell。 所以,我可以这样做:

public void testInterpreter() {
    Interpreter i = new Interpreter();
    i.eval("System.out.println("test1"));
}

但是如果我想在解释器中调用其他方法怎么办?我想要这样的东西:

public void testInterpreter() {
    Interpreter i = new Interpreter();
    i.eval("testMethod()");
}

public void testMethod() {
    System.out.println("test2")
}

但我收到错误“未找到命令”

4 个答案:

答案 0 :(得分:0)

在Interpreter上将类的实例设置为变量:

    i.set("instance", this);
    i.eval("instance.testMethod()");

答案 1 :(得分:0)

检查这是否对您有所帮助。

package beanshell;

import bsh.EvalError;
import bsh.Interpreter;

public class DemoExample {

    public static void main( String [] args ) throws EvalError  {
        Interpreter i = new bsh.Interpreter();
        String usrIp = "if(\"abc\".equals(\"abc\")){"
                + "demoExmp.printValue(\"Rohit\");"
                + "}";

        i.eval(""
                + "import beanshell.DemoExample;"
                + "DemoExample demoExmp = new beanshell.DemoExample();"
                + ""+usrIp);
    }

    public static void printValue(String strVal){
        System.out.println("Printing Value "+strVal);
    }
}

答案 2 :(得分:0)

尝试以下:

package beanshell;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

import bsh.EvalError;
import bsh.Interpreter;

public class Demo_Eval {
    public static Interpreter i = new Interpreter();

    public static void main(String[] args) throws FileNotFoundException, IOException, EvalError, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
        String userInput = "printValue()";

        Object result = i.eval(""
                + "public class EvalUserInput extends beanshell.Demo_Eval{"
                + "public static void getUserInput(){"
                + userInput+";"
                + "}"
                + "}");

        Class<?> noparams[] = {};
        Class cls = (Class) result;
        Object obj = cls.newInstance();
        cls.getDeclaredMethod("getUserInput", noparams).invoke(obj, null);
    }

    public static void printValue(){
        System.out.println("Printed");
    }
}

答案 3 :(得分:-1)

最后我找到了解决方案。

我正在使用Janino Compilerhttp://unkrig.de/w/Janino

String javaClass = "code of new java Class2 that extends existing Class1";
SimpleCompiler sc = new SimpleCompiler();
sc.cook(javaClass);
Class<?> executeClass = sc.getClassLoader().loadClass("Class2");

Class1 instance = (Class1) executeClass.getConstructor().newInstance();

现在我们有了Class2的一个实例。请注意,新的Class2应该扩展现有的Class1,我们只能调用在Class1中声明的方法。