Bunu yapmanın en kolay yolu, orijinal sorudaki kod gibi bir şey kullanmak ve java.io.tmpdir
'u kullanmaktır.
bir test bağımlılığı KOTLIN derleyiciniz:
testCompile group: 'org.jetbrains.kotlin', name: 'kotlin-compiler', version: "$kotlin_version"
Sarıcısını derleyici:
object JvmCompile {
fun exe(input: File, output: File): Boolean = K2JVMCompiler().run {
val args = K2JVMCompilerArguments().apply {
freeArgs = listOf(input.absolutePath)
loadBuiltInsFromDependencies = true
destination = output.absolutePath
classpath = System.getProperty("java.class.path")
.split(System.getProperty("path.separator"))
.filter {
it.asFile().exists() && it.asFile().canRead()
}.joinToString(":")
noStdlib = true
noReflect = true
skipRuntimeVersionCheck = true
reportPerf = true
}
output.deleteOnExit()
execImpl(
PrintingMessageCollector(
System.out,
MessageRenderer.WITHOUT_PATHS, true),
Services.EMPTY,
args)
}.code == 0
}
ClassLoader derlenmiş sınıflardan nesneler oluşturmak için: Burada yeniden kullanılabilir bir çözüm
class Initializer(private val root: File) {
val loader = URLClassLoader(
listOf(root.toURI().toURL()).toTypedArray(),
this::class.java.classLoader)
@Suppress("UNCHECKED_CAST")
inline fun <reified T> loadCompiledObject(clazzName: String): T?
= loader.loadClass(clazzName).kotlin.objectInstance as T
@Suppress("UNCHECKED_CAST")
inline fun <reified T> createInstance(clazzName: String): T?
= loader.loadClass(clazzName).kotlin.createInstance() as T
}
Örnek deneme durumu:
Önce bir KOTLIN kaynak dosyası yapmak
MockClasswriter("""
|
|package com.test
|
|class Example : Consumer<String> {
| override fun accept(value: String) {
| println("found: '$\value'")
| }
|}
""".trimMargin("|"))
.writeToFile(codegenOutputFile)
emin ol derler:
assertTrue(JvmCompile.exe(codegenOutputFile, compileOutputDir))
Yük arayüzü örneği olarak sınıf
Initializer(compileOutputDir)
.createInstance<Consumer<String>>("com.test.Example")
?.accept("Hello, world!")
çıkış beklenecektir olarak: found: 'Hello, world!'
th kullanımı için herhangi bir yolu var mı e JSR 223 API bunu yapmak için mi? Ben çok aşina değilim ben –
JSR 223 sadece uygulama için komut dosyası oluşturma yeteneği ekleyecektir, uygulamanızı ayarlamak daha kolay olacak, ancak RAM sürücüler veya RAM derleme ile size yardımcı olmaz. – Xvolks
REPL'nin neyle çalıştığı sorun değil, değil mi? Bunu teker teker derlediğim her tür tanımlamak için kullanmak ve sonra sadece bu şekilde test etmek mümkün mü? Ben kotlin kaynağından oldum ama REPL programatik olarak –