Java

Javaのバイトコードで遊ぶ (ラムダ式)

Javaのバイトコードで遊ぶ (Hello World) 以下のメソッドのカリー化を例にバイトコードでラムダ式を作ってみます。 int add(int a, int b, int c); ラムダ式の生成にはinvokedynamicと、そのブートストラップにLambdaMetafactory.metafactoryを用います。 me…

Javaのバイトコードで遊ぶ (フィールドとメソッドの定義)

Javaのバイトコードで遊ぶ (Hello World) まずはフィールドの定義について。 ClassWriter.visitFieldを用います。 こんな感じです。 // public static int a = 100; cw.visitField(ACC_PUBLIC + ACC_STATIC, "a", "I", null, 100); // public static String;…

Javaのバイトコードで遊ぶ (例外処理)

Javaのバイトコードで遊ぶ (Hello World) 例外の送出と捕捉を試してみます。 try-catchブロックの定義にはvisitTryCatchBlockを用います。 visitTryCatchBlock(Label start, Label end, Label handler, String type) startとendは、例外ハンドラのスコープの…

Javaのバイトコードで遊ぶ (stack map frame)

Javaのバイトコードで遊ぶ (Hello World) stack map frameについては以下を読みました。 https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.4 http://download.forge.objectweb.org/asm/asm4-guide.pdf java - Is there a better ex…

Javaのバイトコードで遊ぶ (条件分岐と繰り返し)

Javaのバイトコードで遊ぶ (Hello World) 条件分岐と繰り返しはジャンプを使います。 ジャンプ先の指定はLabelを用います。ジャンプ元ではインスタンス化したLabelを指定します。 visitLabelにLabelインスタンスを渡せば、そこがラベルになります。 ジャンプ…

Javaのバイトコードで遊ぶ (四則演算)

Javaのバイトコードで遊ぶ (Hello World) 加算や減算などの基本的な数値演算をやってみます。 まずはintやfloatの計算。 定数値をスタックに積む命令にはバリエーションがあります。 値の大小に応じて、BIPUSHやSIPUSHを使う方法や、visitLdcInsnで任意の値…

Javaのバイトコードで遊ぶ (メソッド呼び出し)

Javaのバイトコードで遊ぶ (Hello World) INVOKEDYNAMIC以外のINVOKE系の命令を使ってみます。 INVOKESTATICはstaticメソッドを呼び出します。引数を順にスタックに積んでから呼び出します。 呼び出し後は引数がスタックから取り除かれ、戻り値がある場合は…

Javaのバイトコードで遊ぶ (Hello World)

ASMを使ってJavaのバイトコードを生成して遊んでみます。 まずはその準備について。 Javaのバージョンは1.8.0_60、ASMのバージョンは5.0.3です。 生成したバイトコードを実行したり、クラスファイルに書き込みたいので そのためのユーティリティ(ExampleUtil…