私が好きなバイトコード操作ライブラリであるASMが、Java7対応の新バージョンを開発しています。まだ情報が少ないのですが、MLの投稿をもとに新機能をまとめてみました。今後実際に使って気づいたことがあれば追記します。
Java7対応(RC1〜)
Java7ではバイトコードのフォーマットにいくつかの変更が含まれているので、従来のバージョンでは対応できません。
invokedynamicに関するオーバーホール(RC1〜)
invokedynamicによるメソッド呼び出しは従来使われていたMethodVisitor.visitMethodInsn(int opcode, String owner, String name, String desc)ではなくvisitInvokeDynamicInsn(String name, String desc, Handle bootstrpMethod, Object... args)メソッドによって行うようになりました。RC1のものですが、サンプルコードがjsr292 cookbookに含まれています。
新しい定数型(RC1〜)
invokedynamicするための定数型としてorg.objectweb.asm.MethodHandleとorg.objectweb.asm.MethodTypeが追加されました。java.lang.invoke.MethodHandleとの衝突を避ける*1ためか、RC2からはorg.objectweb.asm.Handleとorg.objectweb.asm.Typeにリネームされています。
総称型の導入(RC1〜)
APIに総称型が導入されました。例えばAnalyzerクラスはClass Analyzer<V extends Value>
として定義されています。
ただしjarからは総称型に関する情報をそぎ落としてあるため、従来通りJRE1.2でも動作するとのことです。開発時に総称型の恩恵を得るには、情報を落としていないasm-debug-all-*.jarを使う必要があります。
〜Visitorインタフェースを抽象クラスに変更(RC2〜)
インタフェースとして提供されていたClassVisitorやMethodVisitorが、抽象クラスとして提供されるようになりました。ClassAdapterやMethodAdapterの機能もVisitorにマージされたため、Adapterクラスは無くなっています。
その他(RC2〜)
- ClassWriter#getCommonSuperClass()の改善
- CheckClassAdapterに新しいチェック機能を追加
- バグ修正
*1:http://mail.ow2.org/wws/arc/asm/2011-04/msg00035.html