さまざまなクラスの実装をホットスワップする必要があります(実行時に多少変更され、再び変更される可能性がある新しい実装です)。`` Class``インスタンスのジングル表現
ByteBuddy
これは簡単に行うことができますが、(明らかに)インターセプト以外の方法ではあまりできません。そのため、ASMが付属しています。
基本的な使用法は
private static byte[] transformFoo() throws IOException {
ClassReader classReader = new ClassReader(Foo.class.getResourceAsStream("Foo.class"));
ClassWriter classWriter = new ClassWriter(classReader, 0);
MyClassVisitor myClassVisitor = new MyClassVisitor(classWriter);
classReader.accept(myClassVisitor, 0);
return classWriter.toByteArray();
}
は、ASMを使用している
ByteBuddyAgent.install();
byte[] bytes = transformFoo();
ClassFileLocator classFileLocator = ClassFileLocator.Simple.of(Foo.class.getName(), bytes);
new ByteBuddy()
.redefine(Foo.class, classFileLocator)
.make()
.load(Foo.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent());
です。
しかし、ASMは面倒で、より洗練されたものを読み込み、コード化するのは難しいです。 それでは、if-stmtsなどの抽象概念を提供しているので、Jimpleをむしろ使いたいと思っています。
アイデアは、それゆえ、何とか、
Class<?> fooClass = Foo.class;
を開始している
SootClass fooSootClass = ...
に変換し、そこにメソッドを変換し、何とかbyte[]
byte[] ret = ...
return ret;
に戻ってそれをコンパイル
st ByteBuddy
はクラスをリロードできます。一言で言えば
:
私はClass<?>
から変形SootClass
を作成し、私の周り渡すことができbyte[]
にそれをコンパイルしたいです。
どうすればよいですか?
更新
ThisはSootClass
からbyte[]
への変換を行うためにホット示唆しているようだが、これまでのところ、私はClass
からの変換に役立つだろうマニュアルまたは例のいずれかの種類を見つけることができませんでしたSootClass
になります。ほとんどの例では、クラスがロードされる前に一度だけクラスをインストルメントするように見えます。
質問文全体を「* >」から変換可能な 'SootClass'を作成して、それをコンパイルしてバイト数にすることはできますか?あなたの質問の情報の無関係なコード例やASMに関するあなたの意見は、それに関連するものを追加しません。その代わりに、 "変形可能な" SootClass "が何であるか、それが普通の' SootClass'と何か違うか、何を試したのか、どこで問題が発生したのかを説明することに焦点を当てるべきです。 – Holger
@Holgerご意見ありがとうございました。私はモチベーションについてのビットを取り除くことができましたが、「なぜあなたはこれをやりたいのですか」、「これをしないでください」、「全く関係のない何かをすることはできませんか? > "それを維持することは、「あなたは何をしているのか」というようなコメントを避けるべきであり、同時に、彼らの提案が実行可能な選択肢になるかどうかをよりよく判断するための代替的なアプローチを提案したい人々を可能にする。 私の問題としては、読み込まれた後にすすの中にクラスをロードする方法に関する情報を見つけることができません。そのビットを追加する質問が更新されました。 – User1291
Soot固有の質問がある場合、ByteBuddyまたはASMを使用していない理由を説明する必要はありません。誰もあなたが何をしたいのか理解していない限り、なぜ*あなたはそれをしたいのですか?ここでもまた、 "変形可能な" SootClass "とは何か、そして普通の' SootClass'とはどのように違いますか?* Atm、バイトコード処理ツールからバイトコード配列を得る方法を尋ねているようです。そのツールの主なドキュメントでカバーされていないものは、何か問題があります。あなたの質問と[チュートリアルを求める](https://stackoverflow.com/help/on-topic)との違いを説明してください。 – Holger