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 } 

如果我重新加载这个类(使用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重装类加载器?

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

 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()