как получить список сопоставлений констант в пуле констант класса Java?

когда я запускаю javap -c Address.class > Address.txt для определенного класса,

Я получаю кучу вывода с #<NUMBER> в качестве индекса для постоянного пула

Compiled from "Address.java"
public class test.Address extends test.Entity {
  public test.Address();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method test/DefaultEntity."<init>":()V
       4: aload_0       
       5: aconst_null   
       6: putfield      #2                  // Field io:Ljava/lang/String;
       9: aload_0       
      10: aconst_null   
      11: putfield      #3                  // Field zip4:Ljava/lang/String;
      14: aload_0       
      15: aconst_null   
      16: putfield      #4                  // Field zip:Ljava/lang/String;
      19: aload_0 

Как мне получить пул в виде хэш-карты? то есть:

{1  "Method test/DefaultEntity."<init>":()"
 2   "Field io:Ljava/lang/String;"}

person zcaudate    schedule 24.04.2014    source источник
comment
Пул констант находится в верхней части вывода javap -c -verbose YourClass.   -  person A. Webb    schedule 24.04.2014
comment
Есть ли способ получить его программно? Я смотрел asm, но не мог найти метод   -  person zcaudate    schedule 24.04.2014
comment
Вы можете использовать BCEL для анализа Постоянный пул из файл класса.   -  person A. Webb    schedule 24.04.2014
comment
Я надеялся просто использовать включенную библиотеку asm для clojune.   -  person zcaudate    schedule 24.04.2014
comment
Если вы просто хотите проверить код, вы можете использовать: github.com/gtrak/no.disassemble.   -  person guilespi    schedule 24.04.2014
comment
Похоже, что no.disassemble использует инструменты и Eclipse JDT.   -  person A. Webb    schedule 24.04.2014
comment
Если вы можете жить с использованием библиотек Java, вы можете посмотреть этот ответ здесь: stackoverflow.com/questions/14267267/. Раньше я использовал JavaAssist, и это довольно приятно.   -  person grdvnl    schedule 24.04.2014
comment
С ASM вам обычно не нужно иметь дело с пулом констант, поскольку библиотека делает это за вас, например. если вы посетите инструкцию поля, вы уже получите имена и дескриптор типа, извлеченные из пула констант. Это относится ко всем инструкциям со ссылками на постоянный пул.   -  person Holger    schedule 24.04.2014


Ответы (1)


С ASM вы можете использовать ClassReader, чтобы прочитать файл .class, а затем использовать getItemCount() и различные методы чтения для чтения всех элементов пула констант. .

(def cr (clojure.asm.ClassReader "test.Address"))
(.getItemCount cr) 
;; etc
person Alex Miller    schedule 24.04.2014