概要
最近よくメソッドのシグネチャを調べることがある。
そこでjarファイルに含まれているclassファイルを逆アセンブルするまでをメモとしてまとめる。
ここではサンプルとして java.lang.String のシグネチャを取り出すまでを実施してみる。
jarファイルからclassファイルを取得する
jarファイルはzipなのでunzipでOK。
$ unzip $JAVA_HOME/jre/lib/rt.jar
実行するとjarファイルが解凍されて.classが取得できる。
classファイルを逆アセンブルする
javapコマンドを使う。
シグネチャを取得するときは-sオプションを付与する。
$ javap -s java/lang/String.class
Compiled from "String.java"
public final class java.lang.String implements java.io.Serializable, java.lang.Comparable<java.lang.String>, java.lang.CharSequence {
public static final java.util.Comparator<java.lang.String> CASE_INSENSITIVE_ORDER;
descriptor: Ljava/util/Comparator;
public java.lang.String();
descriptor: ()V
public java.lang.String(java.lang.String);
descriptor: (Ljava/lang/String;)V
public java.lang.String(char[]);
descriptor: ([C)V
public java.lang.String(char[], int, int);
descriptor: ([CII)V
public java.lang.String(int[], int, int);
descriptor: ([III)V
public java.lang.String(byte[], int, int, int);
descriptor: ([BIII)V
public java.lang.String(byte[], int);
descriptor: ([BI)V
public java.lang.String(byte[], int, int, java.lang.String) throws java.io.UnsupportedEncodingException;
descriptor: ([BIILjava/lang/String;)V
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
意外と量があったので中略
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public static java.lang.String valueOf(int);
descriptor: (I)Ljava/lang/String;
public static java.lang.String valueOf(long);
descriptor: (J)Ljava/lang/String;
public static java.lang.String valueOf(float);
descriptor: (F)Ljava/lang/String;
public static java.lang.String valueOf(double);
descriptor: (D)Ljava/lang/String;
public native java.lang.String intern();
descriptor: ()Ljava/lang/String;
public int compareTo(java.lang.Object);
descriptor: (Ljava/lang/Object;)I
static {};
descriptor: ()V
}
まとめ
- 取得したシグネチャはJNIで利用中。
- JNIでシグネチャを指定する時に間違いなく指定できて安心。
- JNI以外で使ったことは今のところ無し。
おまけ
javap
Disassembles one or more class files.
usage
javap <options> <classes>
$ javap --help
where possible options include:
-help --help -? Print this usage message
-version Version information
-v -verbose Print additional information
-l Print line number and local variable tables
-public Show only public classes and members
-protected Show protected/public classes and members
-package Show package/protected/public classes
and members (default)
-p -private Show all classes and members
-c Disassemble the code
-s Print internal type signatures
-sysinfo Show system info (path, size, date, MD5 hash)
of class being processed
-constants Show final constants
-classpath <path> Specify where to find user class files
-cp <path> Specify where to find user class files
-bootclasspath <path> Override location of bootstrap class files