Как статически анализировать ссылочные типы, передаваемые каждой инструкции байт-кода?

Я переписал вопрос (вопрос остался тем же, только с меньшим фоновым шумом) в надежде создать меньше путаницы, направленной на всех неправильные вещи - из-за этого некоторые из приведенных ниже комментариев могут показаться вырванными из контекста.

Анализируя байт-код Java, каков самый простой способ найти все возможные ссылочные типы, заданные в качестве параметров для данной инструкции байт-кода Java? Меня интересует тип ссылки, то есть то, что данная инструкция putfield получит целое число, или что она может получить целое число или число с плавающей запятой и т. Д.

Например, рассмотрим этот блок кода:

   0:   aload_1
   1:   invokestatic    #21; //Method java/lang/Integer.valueOf:(Ljava/lang/String;)Ljava/lang/Integer;
   4:   astore_2
   5:   aload_2
   6:   ifnull  17
   9:   aload_0
   10:  aload_2
   11:  putfield    #27; //Field value:Ljava/lang/Number;
   14:  goto    25
   17:  aload_0
   18:  iconst_0
   19:  invokestatic    #29; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   22:  putfield    #27; //Field value:Ljava/lang/Number;
   25:  return

Мы можем сделать вывод, что инструкция putfield на ПК 11 получит тип ссылки Integer .

0: aload pushes ref type of String (the method param)
1: invokestatic pops the ref type and pushes a ref type of Integer (invoked method return type)
4: astore pops the ref type of Integer and stores it in local variable 2
5: aload pushes the ref type of Integer from local variable 2
6: ifnull pops the ref type of Integer and conditionally jumps to pc 17
9: aload pushes "this"
10: aload pushes the ref type of Integer
11: putfield: we know we have a ref type of Integer that the instruction will put in field

Любая из библиотек анализа байт-кода / кода сделает это за меня, или я должен написать это сам ? В проекте ASM есть Analyzer , который, кажется, может сделать часть работы за меня, но на самом деле этого недостаточно, чтобы оправдать переход на его использование.

РЕДАКТИРОВАТЬ: У меня есть сделал домашнее задание и изучил Java VM Spec .

14
задан Sami Koivu 7 June 2011 в 01:19
поделиться