2017-11-22 6 views
0

さまざまなクラスの実装をホットスワップする必要があります(実行時に多少変更され、再び変更される可能性がある新しい実装です)。`` 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[]にそれをコンパイルしたいです。

どうすればよいですか?

更新

ThisSootClassからbyte[]への変換を行うためにホット示唆しているようだが、これまでのところ、私はClassからの変換に役立つだろうマニュアルまたは例のいずれかの種類を見つけることができませんでしたSootClassになります。ほとんどの例では、クラスがロードされる前に一度だけクラスをインストルメントするように見えます。

+0

質問文全体を「* 」から変換可能な 'SootClass'を作成して、それをコンパイルしてバイト数にすることはできますか?あなたの質問の情報の無関係なコード例やASMに関するあなたの意見は、それに関連するものを追加しません。その代わりに、 "変形可能な" SootClass "が何であるか、それが普通の' SootClass'と何か違うか、何を試したのか、どこで問題が発生したのかを説明することに焦点を当てるべきです。 – Holger

+0

@Holgerご意見ありがとうございました。私はモチベーションについてのビットを取り除くことができましたが、「なぜあなたはこれをやりたいのですか」、「これをしないでください」、「全く関係のない何かをすることはできませんか? > "それを維持することは、「あなたは何をしているのか」というようなコメントを避けるべきであり、同時に、彼らの提案が実行可能な選択肢になるかどうかをよりよく判断するための代替的なアプローチを提案したい人々を可能にする。 私の問題としては、読み込まれた後にすすの中にクラスをロードする方法に関する情報を見つけることができません。そのビットを追加する質問が更新されました。 – User1291

+0

Soot固有の質問がある場合、ByteBuddyまたはASMを使用していない理由を説明する必要はありません。誰もあなたが何をしたいのか理解していない限り、なぜ*あなたはそれをしたいのですか?ここでもまた、 "変形可能な" SootClass "とは何か、そして普通の' SootClass'とはどのように違いますか?* Atm、バイトコード処理ツールからバイトコード配列を得る方法を尋ねているようです。そのツールの主なドキュメントでカバーされていないものは、何か問題があります。あなたの質問と[チュートリアルを求める](https://stackoverflow.com/help/on-topic)との違いを説明してください。 – Holger

答えて

0

私は数年前にそれを試みて失敗しました。私はそれが理論上可能であると言いますが、それは簡単です。

+0

あなたはあなたが試したことと失敗した理由を覚えていますか? – User1291

+0

1つの問題は、その場でクラスをインスツルメントしようとすると、通常、java.lang.instrumentを使用して、ロード時にクラスを実行したいということです。これは、基本的にはクラスロードプロセスに関わっているため、一度に1つのクラスだけが表示されることを意味します。しかし、Sootが行うことの多くは、他のクラスへのアクセスが必要です。たとえば、シグネチャを解決する必要があり、時にはメソッド本体を解決する必要があります。これにより、ロードされたクラスのセットとそれらがロードされる順序が完全に変更されます。これはかなりの問題を引き起こしたことを覚えています。 ASMはそのような決議をしません。 – Eric

関連する問題