是否有类似 javap 的工具可以显示原始(非擦除)类型的方法和字段?
我知道在编译源代码时类型信息是erased。但是,编译器必须以某种方式知道,因为它能够确定我对库方法的调用是否与其签名匹配,即使该库已经编译为类文件。所以至少在理论上,应该可以检索类型信息。
我进一步搜索,我找到了这个答案: Where are generic types stored in java class files? 这指向了getGeneric...()方法。所以在我看来,类型信息以某种复杂的方式存储在类文件中,这些方法允许获取它。但到目前为止,我没有找到显示此信息的(命令行)工具。
答案 0 :(得分: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);
}
答案 1 :(得分:1)
在.class
中浏览的一个非常好的工具是JClasslib。这是比javap
更好的选择。屏幕截图示例:
您可以使用它来查看.class
文件中的所有字段,所有方法,字节代码,所有内容。它也可以打开JAR文件。
您可以查看“属性”部分 - &gt;签名。你可以在那里找到这样的信息。
例如:对于以下类定义:
public class BlaType<T extends Integer>
我可以看到这样的事情:
答案 2 :(得分:1)
http://java.decompiler.free.fr/等反编译器会为您提供原始源代码的近似值,包括通用签名。
答案 3 :(得分:0)
你可以尝试Method.toGenericString()
,它似乎可以在运行时从类中获得。此方法应使用通用边界打印方法签名。