私はJavassistを使用して、クラスがロードされるときに動的に操作しています。メソッドにコードを追加するのは比較的簡単ですが、にはコードを削除する方法がありません。Javaバイトコードからの命令の削除
現時点では、nop命令を使用して、コードの削除をシミュレートして、ターゲットのオペコードとパラメータを置き換えます。しかし、私はほとんどハックになるこのことを考慮してください。
各オペコードは、パラメータのバイト長が異なるため、別々に処理する必要があります。場合によっては、削除されたオペコードがスタックに影響を与えるかどうかによって、nopとpopのいずれかを選択する必要もあります。この種の操作は退屈になり始めており、コードはそれに応じて複雑になっています。ですから、当然のことながら、私は既存のソリューションを望んでいます。
最終結果はnopの指示で満たされます。 JVMはパフォーマンスに影響を与えずにそれらを最適化する必要がありますが、結果として得られるバイトコードはまだまだ魅力的でなく、それよりも大きくなければなりません。これは美学の問題の多くですが、それはまだ検討するべきことです。
残念ながら、単にギャップを閉じるためにバイトコード配列の一部をシフトすることは十分ではない - 移動コード(例えば、分岐命令インデックス)への参照が同様に更新されるべきです。
Javassistを使用して命令を削除することはできますか?あるいは、私自身がバイトコードを本質的に解析することなく、簡単に行うことができるバイトコード操作ライブラリがありますか?
私は興味があります。なぜあなたはこれをしたいのですか?クラスを逆コンパイルして変更してコンパイルするのは簡単ではないでしょうか? – Luixv
@Luixv:私は操作プロセスを実行時に自動的に実行したい - 実際のソースコードを手動で変更することはオプションではない。 – thkala
クラスを 'jar'に置くと、重複した' nop'がかなりよく圧縮され、圧縮されたサイズはあまり大きくなりません。 –