我正在尝试Kotlin类的重载,但是最近我陷入了与此类似的问题:
package com.aurieh.reloading
fun doSomething(): String { // a function that does not belong to the class,
// so it gets compiled as FileName$doSomething$...
}
class FileName {
// do things with doSomething
}
而且,如果我重新加载此类(使用
ImplClassLoader.defineClass
和ByteArray
),并尝试执行内部调用doSomething的方法,则会收到类似于以下内容的错误:java.lang.IllegalAccessError: tried to access method com.aurieh.reloading.FileName.doSomething$default()Ljava/lang/String; from class com.aurieh.ares.reloading.FileName`
我会解释为好像重新加载的类没有附加doSomething。
所以我的问题是,我该如何解决该错误?通过以某种方式将doSomething附加到重新加载类加载器?
供参考,我的类(class)重载代码:
class Reloader : ClassLoader() {
fun load(name: String, bytes: ByteArray, offset: Int, len: Int): Class<*> {
return defineClass("com.aurieh.reloading.$name", bytes, offset, len)
}
}
对于加载:
val bytes = File("../classes/path/to/class/FileName.class").readBytes()
Reloader().load("FileName", bytes, 0, bytes.size).newInstance()
最佳答案
基本上,顶级函数不会编译到文件中定义的任何类中。而是为顶级成员创建一个单独的类:FileNameKt
(如果文件名为FileName.kt
)。
因此,要使您的类正确加载(即没有任何不满意的链接),您必须先加载FileNameKt
类:
val bytes1 = File("../classes/path/to/class/FileNameKt.class").readBytes()
val bytes2 = File("../classes/path/to/class/FileName.class").readBytes()
val reloader = Reloader()
reloader.load("FileNameKt", bytes1, 0, bytes1.size)
reloader.load("FileName", bytes2, 0, bytes2.size).newInstance()
关于classloader - Kotlin类随同对象/功能重新加载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41748943/