gpt4 book ai didi

classloader - Kotlin 类重新加载伴随对象/函数

转载 作者:行者123 更新时间:2023-12-02 13:06:40 27 4
gpt4 key购买 nike

我正在尝试重新加载 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.defineClassByteArray ),并尝试调用内部调用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com