从java中的kotlin脚本文件加载类

从java中的kotlin脚本文件加载类,java,scripting,kotlin,Java,Scripting,Kotlin,Groovy有一个GroovyClassLoader,可以使用GroovyClassLoader.parseClass(字符串脚本)将Groovy类加载到java应用程序中,然后在以后实例化并调用它的方法 有没有一种方法可以通过kotlin脚本文件(.kts)实现这一点 我知道我可以使用jsr223使用ScriptEngine.eval(字符串脚本)对脚本文件求值,该脚本使用KotlinJsr223JvmLocalScriptEngineFactory,但是通过一个脚本调用eval,该脚本只是一

Groovy有一个
GroovyClassLoader
,可以使用
GroovyClassLoader.parseClass(字符串脚本)
将Groovy类加载到java应用程序中,然后在以后实例化并调用它的方法

有没有一种方法可以通过kotlin脚本文件(
.kts
)实现这一点

我知道我可以使用jsr223使用
ScriptEngine.eval(字符串脚本)
对脚本文件求值,该脚本使用
KotlinJsr223JvmLocalScriptEngineFactory
,但是通过一个脚本调用eval,该脚本只是一个类声明,返回null,我无法访问该类

我添加了正确的依赖项,并且正确加载了kotlin脚本引擎工厂(我可以在new ScriptEngineManager().getEngineFactories()的结果中看到它),我只是在eval的结果中得到null。假设这是因为脚本本身没有真正返回任何内容,那么只需定义一个类。这就是我尝试加载的脚本文件的外观:

package scripts

import com.example.SomeJavaInterface
import com.example.SomeArg
import com.example.SomeReturnValue

class TestScript : SomeJavaInterface {
    override fun someMethod(SomeArg arg): SomeReturnValue {
        return SomeReturnValue()
    }
}
我使用的是kotlin stdlib、kotlin编译器和kotlin脚本util版本1.2.41


使用kotlin脚本无法实现这一点吗?

您可以从脚本返回类本身。例如,脚本的最后一行可以是
TestScript::class
。这将为您提供一个
KClass
,然后可以对其进行实例化。为了给您提供一个真实的示例,您可以看到我如何实例化从脚本中获得的类。

这是我在以下库中提供的内容:@s1m0nw1感谢您的评论。我已尝试使用您的库,但遇到了一个
非法状态异常:无法从.kts加载脚本。现在,从我看到的库中,一个eval,然后尝试强制转换结果,结果中断,因为eval返回null,就像我在最初的eval调用中对我所做的一样。你能给我看一下你的脚本吗?@s1m0nw1我已经将它添加到OP.Calling
new KtsObjectLoader().load(Files.newbufferedrander(path.get(“script.kts”))
或调用
scriptEngine.eval(脚本)
都返回null。脚本文件已正确加载(调试时我可以看到它的内容)