ClassCastException, когда объект case с ScriptEngine

Я пытаюсь передать объект между Java и Groovy с ScriptEngine так что я могу отделить некоторую логику в Groovy сценарий. Но я встретил две проблемы:

  1. не может передать объект в Groovy скрипт.
  2. не может получить объект из заводного скрипта.

Вот коды:

App.java

package test.testScriptEngine;

import java.io.FileNotFoundException;
import java.io.FileReader;

import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;


public class App {
    public static void main(String[] args) throws Exception {
        App app=new App();
        Output out=app.runSript();
        System.out.println(out.a);
    }

    public Output runSript() throws ScriptException, FileNotFoundException {

        ScriptEngineManager sem = new ScriptEngineManager();
        ScriptEngine engine = sem.getEngineByName("groovy");
        Bindings binding = engine.createBindings();

        Input input=new Input(4,5);
        binding.put("input", input);

        FileReader reader = new FileReader("src/main/resources/test.groovy");
        Object obj = engine.eval(reader, binding);

        return (Output) obj;
    }

}
class Input{
    public Input(int i, int j) {
        this.a=i;
        this.b=j;
    }
    int a=1;
    int b=2;
}
class Output{
    int a=1;
}

test.groovy

package test.testScriptEngine;

class Input{
        int a=1;
        int b=2;
    Input(int a,int b){
        this.a=a;
        this.b=b;
    }
}
class Output{
        int a=1;
}

Output cal(Input input){
    Output out= new Output();
    out.a=input.a+input.b;
    println(out.a);
    return out;
}
Input input=new Input(2,3);
return cal(input);

Вывод:

5
Exception in thread "main" java.lang.ClassCastException: test.testScriptEngine.Output cannot be cast to test.testScriptEngine.Output
    at test.testScriptEngine.App.runSript(App.java:31)
    at test.testScriptEngine.App.main(App.java:15)

Ожидаемый результат должен быть 9 а также Output должен быть возвращен.

1 ответ

Когда загрузчик классов Groovy компилирует ваш скрипт, он создает класс test.testScriptEngine.Output,

Однако класс, сгенерированный из скрипта, не совпадает с test.testScriptEngine.Output класс, скомпилированный из кода Java. Даже если их байт-код будет одинаковым, разные загрузчики классов сделают их разными классами.

Другие вопросы по тегам