我已經在我的應用程序下面的一段代碼,運行腳本設置爲代表Groovy的腳本BaseScript
CompilerConfiguration compilerConfiguration = new CompilerConfiguration();
compilerConfiguration.setScriptBaseClass(DelegatingScript.class.getName());
GroovyShell shell = new GroovyShell(compilerConfiguration);
try {
String scriptText = "";
try (Scanner scanner = new Scanner(resources[0].getInputStream())){
scriptText = scanner.useDelimiter("\\A").next();
}
DelegatingScript script = (DelegatingScript)shell.parse(scriptText);
script.setDelegate(this.getDelegate());
script.run();
} catch (IOException e) {
throw new IllegalArgumentException("Cannot read script resource: '" + filename + "': " + e.getLocalizedMessage(), e);
}
它的工作對Groovy腳本,直到我開始重構一些功能到@BaseScript
類。所以,比如我有這個Groovy類
package com.example.scripts
abstract class MyBaseScriptClass extends Script {
int getTheMeaningOfLife() { 42 }
}
然後,我有劇本
package scripts
import com.example.scripts.MyBaseScriptClass
import groovy.transform.BaseScript
@BaseScript MyBaseScriptClass baseScript
add(context.application, 'test', theMeaningOfLife)
它無法與錯誤運行:
Caused by: java.lang.ClassCastException: scripts.Script1 cannot be cast to groovy.util.DelegatingScript
at com.metlife.harmony.scripts.groovy.dsl.RunScript.call(RunScript.java:86) ~[classes/:?]
也就是說,如果我在課堂上使用@BaseScript
它未能將它投射到DelegatingScript
?有什麼解決辦法嗎?
只是讓MyBaseScriptClass延伸DelegatingScript? RunScript看起來像一個自定義代碼,需要將腳本強制轉換爲DelegatingScript –
不,擴展'DelegatingScript'不起作用。我需要將腳本強制轉換爲委託來爲其設置一個委託'script.setDelegate(this.getDelegate());'這是一種傳遞執行上下文的方式 - 而不是設置綁定,這需要明確地設置變量,I只是使用委託機制。 – EvgeniySharapov
我知道,但@BaseScript覆蓋你的setScriptBaseClass(DelegatingScript)。你的腳本的基類是MyBaseScriptClass,這不能轉換爲DelegatingScript –