Я переписал вопрос (вопрос остался тем же, только с меньшим фоновым шумом) в надежде создать меньше путаницы, направленной на всех неправильные вещи - из-за этого некоторые из приведенных ниже комментариев могут показаться вырванными из контекста.
Анализируя байт-код 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 .