1
オブジェクト、および内部doSomethingのを呼び出す方法は、私はのようなエラーが出る起動しない試してください:どのように、私の質問は以下のようになり ..リロードクラスがdoSomethingのが取り付けられていないかのように私はこれを解釈するKotlinクラスは、私はKotlinクラスのリロードを試していますが、私は最近、これに近いもので捕まってしまった/機能
java.lang.IllegalAccessError: tried to access method com.aurieh.reloading.FileName.doSomething$default()Ljava/lang/String; from class com.aurieh.ares.reloading.FileName`
をこのエラーを解決できますか?どういうわけか、クラスローダーをリロードするために何かをつけていますか?参考のため
、コードリロード私のクラス:
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()
ああ、ありがとう..あなたの場合ラムダをクラスメソッド関数で使用すると、FileName $ method_lambda_is_being_called_in $ number_of_lambda.classとしてコンパイルされます。方法があれば、どうやってそれらを動的にチェックするのですか? – Aurieh
@Aurieh、私はあなたの 'ClassLoader'実装で' loadClass'のようなものをオーバーライドしなければならないと思います。ラムダを使用する関数が呼び出されると、 'name'' com.example.FileName $ f $ x $ 1'を持つ' loadClass(name:String?) 'の呼び出し、つまりラムダクラス名が見えます。これは、クラスパスのコンセプトに近づきます。クラスローダーは、名前によって特定のパスからクラスをロードできるようにすることができます。クラスを初めて使用すると、実装によってロードされます。 – hotkey
ああ、私は現在、そのパスにあるすべてのクラスを調べ、クラス名+ $で始まるかどうかをチェックし、ロードしているという非常に汚い実装をしています。どのように私はあなたの方法を実装することができるかを見てみましょう。しかし、今のところ、私は答えとしてマークしています、ありがとう! – Aurieh