計算方法
ソースコードから計算
javap
コマンドを実行すると、クラスファイルが逆アセンブルされ、 Java バイトコードが人間の読みやすい形式で出力される。
javac Employee.java
javap -c Employee.class
この出力結果であるバイトコードを見れば、各メソッドの長さを計算できる。
ちなみに、 Java バイトコードのオペーコードは 1 byte である。
複数の引数を必要とする命令もあるため、結果として1命令は複数 byte になりえる。
Jar ファイルから計算
jar ファイルを解凍し、クラスファイルを取り出す。
そのクラスファイルを引数として指定し、 javap コマンドを実行すれば良い。
jar xvf sample-1.0-SNAPSHOT.jar
javap -c com/hidetai/Employee.class
例
Employee.java
package com.hidetai;
public class Employee
{
private int id;
void setId(int id) {
this.id = id;
}
int getId() {
return id;
}
}
上記のコードをコンパイルし、クラスファイルを生成する。
そして、そのクラスファイルを引数として javap コマンドを実行する。
javap -c Employee.class
すると、以下のようなバイトコードが出力される。
Employee.bc
Compiled from "Employee.java"
public class com.hidetai.Employee {
public com.hidetai.Employee();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
void setId(int);
Code:
0: aload_0
1: iload_1
2: putfield #2 // Field id:I
5: return
int getId();
Code:
0: aload_0
1: getfield #2 // Field id:I
4: ireturn
}
この出力を見れば、例えば setId(int) メソッドは 6 byte の長さであることが分かる。
javap
クラスファイルを逆アセンブルするコマンド。
以下のページに仕様が書いてある。
参考
-
jvm - How many bytes of bytecode has a particular method in Java? - Stack Overflow
- バイトコードの出力方法について書いてある。
-
- バイトコードの説明が分かりやすい。