12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

jarファイルからシグネチャを取得するまで

Posted at

概要

最近よくメソッドのシグネチャを調べることがある。
そこで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
12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?