0

ByteBuddyでバイトコード内のいくつかのタイプの発生を置き換えることは可能ですか? E.私はクラスByteBuddyでタイプコードを置換する

class MyClass { 
    Foo makeFoo() { 
     return new Foo(); 
    } 
} 

を持っている場合、私はそれが

class MyClass { 
    Bar makeFoo() { 
     return new Bar(); 
    } 
} 

iが同等になるように、このクラスのバイトコードを変換したいです。 e。 Fooのすべての出現をBarに置き換えます。

+1

ByteBuddyはASMで解決し、特定のユースケースではより簡単なインターフェースを提供しますが、タイプの出現を置き換えることは、これらのユースケースにはないと思います。私はこれまでのところ、この種のタスクに最適な選択ではないと考えています。クラスの定数プールを処理するだけで、すべての発生を簡単かつ効率的に置き換えることができます。 – Holger

答えて

1

Holgerが示唆しているように、これはByte Buddyが達成しようとしている範囲ではありません。あなたのケースでは、BarFooの有効な置き換えであることを検証する必要があるコード操作のための安全な環境を提供しようとします。また、スタックマップフレームをかなり高価なものに再計算する必要があります。

Byte Buddyを使用する場合は、基礎となるASMへのアクセスを提供します。 ASMはRemapperを提供しています。これを行うだけの場合は、おそらくByte BuddyなしでASMを使用することを検討する必要があります。ホーゲルがコメントで述べたように、最も効率的な方法は、ASMがサポートしていないFooへのルート参照である定数プールエントリを書き直して、簡単なASMの訪問が生成されなくても別の方法あまりにも多くのオーバーヘッド。

関連する問題