Я переписал вопрос (вопрос остается тем же, только с меньшим количеством фонового шума) в надежде создать меньше путаницы, направленной на все неправильные вещи - из-за этого некоторые из приведенных ниже комментариев могут показаться вне контекста.
Анализируя байт-код Java, какой самый простой способ найти все возможные ссылочные типы, заданные в качестве параметров для данной инструкции байт-кода Java?Меня интересует тип ссылки, то есть, что заданная инструкция putfield получит Integer или что она может получить Integer или Float и т. Д.
Например, рассмотрим этот блок кода:
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 , который, кажется, может выполнять часть работы для меня, но на самом деле этого недостаточно, чтобы оправдать переход на его использование.
EDIT: Я сделал домашнее задание и изучил Java VM Spec .