从编译的类文件显示泛型类型参数(Displaying generic type parameters

2019-09-21 05:56发布

是否有一个工具类似的javap,可以显示与原来的(非擦除)类型的方法和领域?

我知道类型信息被擦除时,源代码被编译。 然而,编译器必须以某种方式知道,因为它是能够确定,即使库已经被编译成class文件我到图书馆方法的调用,满足他们的签名。 所以,至少在理论上,应该可以检索类型的信息。

我进一步搜索,我发现这个答案: 当存储在Java类文件一般类型? 它向我指出getGeneric ...()方法。 所以在我看来,该类型的信息存储在类文件中的一些复杂的方法,这些方法允许获得它。 但到目前为止,我没有找到一个(命令行)工具,它会显示此信息。

Answer 1:

反编译如http://java.decompiler.free.fr/会给你一个近似原始的源代码,包括通用签名。



Answer 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);
}


Answer 3:

在一个四处寻找一个很好的工具.class是JClasslib 。 它比更好的选择javap 。 一个例子截图:

你可以用它来查看里面的所有领域.class文件,所有的方法,字节码,应有尽有。 它也可以打开JAR文件。

你可以看一下在“属性”部分 - >签名。 您可以在那里找到这些信息。

例如:对于下面的类定义:

public class BlaType<T extends Integer>

我可以看到这样的事情:



Answer 4:

您可以尝试Method.toGenericString()它似乎一切,你可以从类中运行时获得。 此方法应与通用边界打印方法签名。



文章来源: Displaying generic type parameters from compiled class files