ClassCastException, когда объект case с ScriptEngine
Я пытаюсь передать объект между Java и Groovy с ScriptEngine
так что я могу отделить некоторую логику в Groovy сценарий. Но я встретил две проблемы:
- не может передать объект в Groovy скрипт.
- не может получить объект из заводного скрипта.
Вот коды:
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. Даже если их байт-код будет одинаковым, разные загрузчики классов сделают их разными классами.