- 私は、クラスAは、私はCustomClassLoaderが
defineClass(className, byte[], offset, length)
を使用するために、ClassLoaderを拡張作成したB. - を拡張しています。
- 私は
new CustomClassLoader(Thread.currentThread().getContextClassLoader())
をインスタンス化しました。 したがって、私のCustomClassLoaderの親は、現在のスレッドのClassLoaderです。 - ASMフレームワークを使用してBクラスを変更しました。私は変更されたクラスを.classファイルに書き出し、逆コンパイラを使って動作させるようにしています。そして、それは動作します。
- 私はCustomClassLoaderに変更されたBクラスを追加しました
- 私はCustomClassLoaderで
Thread.currentThread().setContextClassLoader()
を設定しました。 Class.forName(String, true, the CustomClassLoader)
を使用してAをロードしました。- しかし、ロードされたBクラスは元のクラスであるようです。
何が間違っていましたか? 詳細情報が必要な場合は、詳細なトピックはGitHubです。修正されたスーパークラスをJavaでロードするには?
"A"クラスがロードされていないので、ClassLoaderの子はClassLoaderの親にクラスのロードを委譲します。 しかし、Bは子にロードされます(変更されたバージョンは子にロードされる)ので、AがBを拡張するためにAがBを必要とする場合、Bが親からロードされる理由 –
「しかし、Bは子供の中に入っている」とはどういう意味ですか? Bが親クラスローダーに存在する場合、それは子にロードされません。なぜなら、 'loadClass'をオーバーライドしないすべてのクラスローダーは最初にその親に委譲し、子クラスノードで見つからない場合にのみロードしようとします親 –
実行時にBクラスのバイトコードを変更する必要があります。 変更されたBクラスを保存するには、parent.defineClass()が表示されず、元のBクラスが親クラスローダーに存在する可能性があるため、child.defineClass()を使用する必要があります。 - Bが子 に変更し、ロードされた - Aが子からロードされる - >親 への委譲 - B親 からロードしているように見える - - AはB が延びBが親に保存されていないので、親ロードBはURLを使用して私は思う - 元の元のBのクラスをロード - Bは2回読み込まれます:元の親と子で修正。 –