मुझे मूल प्रश्न में कोड की तरह कुछ उपयोग करने और java.io.tmpdir
का उपयोग करने का सबसे आसान तरीका मिल गया है। यहाँ एक फिर से प्रयोग करने योग्य समाधान है: संकलित वर्गों से वस्तुओं बनाने के लिए
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: संकलक के लिए
testCompile group: 'org.jetbrains.kotlin', name: 'kotlin-compiler', version: "$kotlin_version"
आवरण:
एक परीक्षण निर्भरता के रूप में kotlin संकलक जोड़े
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
}
उदाहरण परीक्षण केस:
पहले एक kotlin स्रोत फ़ाइल बनाने
MockClasswriter("""
|
|package com.test
|
|class Example : Consumer<String> {
| override fun accept(value: String) {
| println("found: '$\value'")
| }
|}
""".trimMargin("|"))
.writeToFile(codegenOutputFile)
सुनिश्चित करें कि यह संकलित:
assertTrue(JvmCompile.exe(codegenOutputFile, compileOutputDir))
लोड इंटरफ़ेस उदाहरण के रूप में वर्ग
Initializer(compileOutputDir)
.createInstance<Consumer<String>>("com.test.Example")
?.accept("Hello, world!")
उत्पादन की उम्मीद होगी के रूप में: found: 'Hello, world!'
क्या वें का उपयोग करने का कोई तरीका है ई जेएसआर 223 एपीआई ऐसा करने के लिए? मैं इसके साथ बहुत परिचित नहीं हूं –
जेएसआर 223 आपको अपने एप्लिकेशन में स्क्रिप्टिंग क्षमता जोड़ने देगा, लेकिन आपके एप्लिकेशन को ट्यून करना आसान होगा, लेकिन यह रैम ड्राइव या रैम में संकलन करने में आपकी सहायता नहीं करेगा। – Xvolks
Thats क्या आरपीएल के साथ चलता है, नहीं? प्रत्येक प्रकार को परिभाषित करने के लिए इसका उपयोग करना संभव है जिसे मैं एक-एक करके संकलित करता हूं और फिर उस तरह से परीक्षण करता हूं? मैं कोटलिन स्रोत के माध्यम से रहा हूं लेकिन मैं वास्तव में यह नहीं समझ सकता कि आरईपीएल को प्रोग्रामेटिक रूप से –