小编Aur*_*ieh的帖子

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

我正在尝试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
}
Run Code Online (Sandbox Code Playgroud)

如果我重新加载这个类(使用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`
Run Code Online (Sandbox Code Playgroud)

我会解释这个,好像重新加载的类没有附加doSomething ..所以我的问题是,我将如何解决这个错误?通过某种方式将doSomething附加到重装类加载器?

作为参考,我的类重装代码:

class Reloader : ClassLoader() {
    fun load(name: String, bytes: ByteArray, offset: Int, len: Int): Class<*> {
        return defineClass("com.aurieh.reloading.$name", bytes, offset, len)
    }
}
Run Code Online (Sandbox Code Playgroud)

并加载:

val bytes = File("../classes/path/to/class/FileName.class").readBytes()
Reloader().load("FileName", …
Run Code Online (Sandbox Code Playgroud)

classloader kotlin

1
推荐指数
1
解决办法
844
查看次数

标签 统计

classloader ×1

kotlin ×1