2

メソッドとフィールドを元の (消去されていない) タイプで表示できるjavapに似たツールはありますか?

ソースコードをコンパイルすると、型情報が消去されることがわかっています。ただし、コンパイラは、ライブラリが既にクラス ファイルにコンパイルされている場合でも、ライブラリ メソッドへの呼び出しがシグネチャと一致するかどうかを判断できるため、何らかの方法で知る必要があります。したがって、少なくとも理論的には、型情報を取得できるはずです。

さらに検索したところ、次の回答が見つかりました: Javaクラスファイルにジェネリック型はどこに保存されていますか? getGeneric...()メソッド を教えてくれました。したがって、型情報は複雑な方法でクラスファイルに保存されているように見えますが、これらのメソッドを使用すると取得できます。しかし、これまでのところ、この情報を表示する (コマンド ライン) ツールは見つかりませんでした。

4

4 に答える 4

2

古いバージョンの を使用していjavapます。

$ javap -version
1.7.0

$ javap java.util.List
Compiled from "List.java"
public interface java.util.List<E> extends java.util.Collection<E> {
  public abstract int size();
  public abstract boolean isEmpty();
  public abstract boolean contains(java.lang.Object);
  public abstract java.util.Iterator<E> iterator();
  public abstract java.lang.Object[] toArray();
  public abstract <T extends java/lang/Object> T[] toArray(T[]);
  public abstract boolean add(E);
  public abstract boolean remove(java.lang.Object);
  public abstract boolean containsAll(java.util.Collection<?>);
  public abstract boolean addAll(java.util.Collection<? extends E>);
  public abstract boolean addAll(int, java.util.Collection<? extends E>);
  public abstract boolean removeAll(java.util.Collection<?>);
  public abstract boolean retainAll(java.util.Collection<?>);
  public abstract void clear();
  public abstract boolean equals(java.lang.Object);
  public abstract int hashCode();
  public abstract E get(int);
  public abstract E set(int, E);
  public abstract void add(int, E);
  public abstract E remove(int);
  public abstract int indexOf(java.lang.Object);
  public abstract int lastIndexOf(java.lang.Object);
  public abstract java.util.ListIterator<E> listIterator();
  public abstract java.util.ListIterator<E> listIterator(int);
  public abstract java.util.List<E> subList(int, int);
}
于 2012-08-15T09:56:03.423 に答える
1

を調べるための非常に優れたツール.classJClasslibです。よりもはるかに優れた代替手段ですjavap。スクリーンショットの例:

ここに画像の説明を入力

これを使用して、ファイル内のすべてのフィールド.class、すべてのメソッド、バイト コード、すべてを表示できます。JAR ファイルを開くこともできます。

「属性」セクション -> 署名で確認できます。そのような情報を見つけることができます。

例: 次のクラス定義の場合:

public class BlaType<T extends Integer>

私はこのようなものを見ることができます:

ここに画像の説明を入力

于 2012-08-15T08:31:42.147 に答える
1

http://java.decompiler.free.fr/などの逆コンパイラは、一般的な署名を含む元のソース コードに近いものを提供します。

于 2012-08-15T08:33:18.627 に答える
0

試してみるMethod.toGenericString()と、実行時にクラスから取得できるすべてのようです。このメソッドは、一般的な境界でメソッド シグネチャを出力する必要があります。

于 2012-08-15T08:26:55.660 に答える