2017-01-19 16 views
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() 

答えて

4

は基本的には、トップレベルの関数は、ファイルに定義されたクラスのいずれかにコンパイルされていません。代わりに、トップレベルメンバーの別のクラスが作成されます: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() 
+0

ああ、ありがとう..あなたの場合ラムダをクラスメソッド関数で使用すると、FileName $ method_lambda_is_being_called_in $ number_of_lambda.classとしてコンパイルされます。方法があれば、どうやってそれらを動的にチェックするのですか? – Aurieh

+0

@Aurieh、私はあなたの 'ClassLoader'実装で' loadClass'のようなものをオーバーライドしなければならないと思います。ラムダを使用する関数が呼び出されると、 'name'' com.example.FileName $ f $ x $ 1'を持つ' loadClass(name:String?) 'の呼び出し、つまりラムダクラス名が見えます。これは、クラスパスのコンセプトに近づきます。クラスローダーは、名前によって特定のパスからクラスをロードできるようにすることができます。クラスを初めて使用すると、実装によってロードされます。 – hotkey

+0

ああ、私は現在、そのパスにあるすべてのクラスを調べ、クラス名+ $で始まるかどうかをチェックし、ロードしているという非常に汚い実装をしています。どのように私はあなたの方法を実装することができるかを見てみましょう。しかし、今のところ、私は答えとしてマークしています、ありがとう! – Aurieh

関連する問題