Javassistを使用して、ロード時にクラスを動的に操作しています。Javassist を使用するとメソッドにコードを追加するのは比較的簡単ですが、コードを削除する方法を見つけることができませんでした。
現時点では、nop命令を使用して対象のオペコードとパラメーターを置き換えることで、コードの削除をシミュレートしています。ただし、これはほとんどハックだと思います。
パラメータのバイト長が異なるため、各オペコードを個別に処理する必要があります。場合によっては、削除されたオペコードがスタックに影響を与えるかどうかに応じて、nopとpopのどちらかを選択する必要もあります。この種の操作は退屈になり始めており、それを行うコードはそれに応じて複雑になっています。したがって、当然、既存のソリューションを望んでいます。
最終結果はnop命令で埋められます。JVM はパフォーマンスに影響を与えずにこれらを最適化する必要がありますが、結果のバイトコードは依然として非常に洗練されておらず、必要以上に大きくなっています。これは美学の問題ですが、それでも考慮すべき事項です。
残念ながら、バイトコード配列の一部をシフトしてギャップを埋めるだけでは十分ではありません。移動したコードへの参照 (分岐命令インデックスなど) もすべて更新する必要があります。
Javassist を使用して命令を削除することは可能ですか? あるいは、基本的に自分でバイトコードを解析しなくても、簡単にそれを行うことができるバイトコード操作ライブラリはありますか?