Java 已编译脚本的多个实例
我正在通过ScriptEngine加载Scala脚本,并使用CompiledScript评估脚本 我使用Java接口将Scala脚本映射到Java端,如下所示 Java接口:Java 已编译脚本的多个实例,java,scala,scriptengine,Java,Scala,Scriptengine,我正在通过ScriptEngine加载Scala脚本,并使用CompiledScript评估脚本 我使用Java接口将Scala脚本映射到Java端,如下所示 Java接口: public interface SomeInterface { void method1(); } Scala脚本: class ScalaImp extends SomeInterface { override def method1() : Unit = { //Implementation
public interface SomeInterface {
void method1();
}
Scala脚本:
class ScalaImp extends SomeInterface {
override def method1() : Unit = {
//Implementation
}
}
加载类型为SomeInterface
的对象的代码如下所示
String extension = path.getFileName().toString();
extension = extension.substring(extension.lastIndexOf(".") > 0 ? extension.lastIndexOf(".") + 1 : 0);
ScriptEngine engine = new ScriptEngineManager().getEngineByExtension(extension);
File file = path.toFile();
if (file.exists() && file.isFile()) {
SomeInterface mappingInterface = null;
SomeInterface mappingInterface2 = null;
try(FileReader fr = new FileReader(file)) {
Compilable compilable = (Compilable)engine;
CompiledScript compiledScript = compilable.compile(fr);
mappingInterface = (SomeInterface)compiledScript.eval();
mappingInterface2 = (SomeInterface)compiledScript.eval(); //This fails. Any alternative for this?
}
catch (FileSystemException e) {
logger.error("Cannot load file");
}
return mappingInterface;
}
我想创建脚本的多个实例。但是上面的代码给出了以下错误:在第二次eval()
调用时未能加载“$line6.$eval”:$line6.$eval
。我知道我可以使用多个CompiledScript实例并分别进行计算。但是编译时间太长,超出了程序的性能预期
是否可以使用一个已编译脚本实例创建同一脚本的多个实例?不太可能。它通过使用REPL来工作,REPL总是编译以评估2.12及更早版本中的代码 可能您正在尝试:
$ scala
Welcome to Scala 2.12.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_144).
Type in expressions for evaluation. Or try :help.
scala> val s = scala.tools.nsc.interpreter.Scripted()
s: scala.tools.nsc.interpreter.Scripted = scala.tools.nsc.interpreter.Scripted@432f4626
scala> s.eval("class C")
res0: Object = null
scala> val c = s.compile("new C")
c: javax.script.CompiledScript = scala.tools.nsc.interpreter.Scripted$WrappedRequest@13346a64
scala> c.eval()
res1: Object = C@2d093067
scala> c.eval()
res2: Object = C@2693e39c
您可以观察编译工作:
scala> s.intp.settings.Xprint.value_=(List("typer"))
在第二次评估中,它重用了包装用户代码的类,但编译了一个转发定义的新包装器。看起来有一个bug,它试图转发值定义和类型;在这种情况下,类定义不起作用
可能您不打算定义两个不同的类,而是返回同一类的两个实例,如图所示?谢谢。是的,我想创建同一类的两个实例。那么,在这种情况下,有没有解决办法?它是否与以下bug有关?我的示例创建了两个C实例,但是C的定义不能在编译的脚本行中。我得到了一个类似的错误。加载“$line6.$eval”失败:需要一个小建议。使用可克隆接口克隆创建的对象是否会有任何看不见的问题?