Отображение параметров универсального типа из скомпилированных файлов классов

Есть ли инструмент, похожий на javap, который мог бы отображать методы и поля с их исходными (нестертыми) типами?

Я знаю, что информация о типе удаляется при удалении исходного кода. скомпилировано. Однако компилятор должен как-то это знать, потому что он способен определить, соответствуют ли мои вызовы библиотечных методов их сигнатурам, даже если библиотека уже скомпилирована в файлы классов. Так что, по крайней мере теоретически, должна быть возможность получить информацию о типе.

Я искал дальше и нашел этот ответ: Где хранятся общие типы в файлах классов Java?, который указал мне на getGeneric...(). Так что мне кажется, что информация о типе каким-то сложным образом хранится в файлах классов, и эти методы позволяют ее получить. Но пока я не нашел инструмента (командной строки), который отображал бы эту информацию.


person Petr    schedule 15.08.2012    source источник
comment
Поскольку javap является инструментом командной строки и, похоже, не соответствует вашим потребностям, вам необходимо более точно указать свои критерии.   -  person Ben Schulz    schedule 15.08.2012
comment
@BenSchulz Кажется, я сделал: ... инструмент... который мог отображать методы и поля с их исходными (нестертыми) типами?   -  person Petr    schedule 15.08.2012


Ответы (4)


Декомпилятор, такой как http://java.decompiler.free.fr/, даст вам приближение к оригинальный исходный код, включая общие подписи.

person Ian Roberts    schedule 15.08.2012

Вы используете старую версию 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);
}
person Ben Schulz    schedule 15.08.2012
comment
Спасибо, я не знал, что JDK7 javap делает это (я использую JDK6, а javap не показывает информацию об общем типе). - person Petr; 15.08.2012

Очень хорошим инструментом для просмотра .class является JClasslib. Это гораздо лучшая альтернатива, чем javap. Пример скриншота:

введите здесь описание изображения

Вы можете использовать его для просмотра всех полей внутри .class файла, всех методов, байт-кода, всего. Он также может открывать файлы JAR.

Посмотреть можно в разделе "Атрибуты" -> Подпись. Вы можете найти такую ​​информацию там.

Например: Для следующего определения класса:

public class BlaType<T extends Integer>

Я вижу что-то вроде этого:

введите здесь описание изображения

person Radu Murzea    schedule 15.08.2012

Вы можете попробовать Method.toGenericString() и, кажется, все, что вы можете получить от класса во время выполнения. Этот метод должен печатать сигнатуру метода с общими границами.

person gkuzmin    schedule 15.08.2012