java - 类型注释位置删除

标签 java reverse-engineering bytecode

我目前遇到一个奇怪的情况,似乎某些 TypeAnnotation 坐标/路径数据最终被删除。下面的界面虽然显然不是您在实际代码中看到的任何内容(这仅用于实验目的),但产生的坐标数据似乎已被删除。

public interface WhackedOutCoordinates<M extends 
      @Whoopy Derpable<@Whoopy ? extends Comparable<@Whoopy M>>
     &@Whoopy Comparable<@Whoopy List<? super @Whoopy M>>
     &@Whoopy Serializable> {}

javap的输出如下:

0: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1
1: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1, location=[TYPE_ARGUMENT(0)]
2: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1, location=[TYPE_ARGUMENT(0), WILDCARD, TYPE_ARGUMENT(0)]
3: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2
4: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2
5: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2
6: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=3

类签名的第二部分相交

@Whoopy Comparable<@Whoopy List<? super @Whoopy M>>

似乎所有类型参数注释都指向一个位置,由

指示
3: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2
4: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2
5: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2

我们可以看到类签名的第一部分相交

      @Whoopy Derpable<@Whoopy ? extends Comparable<@Whoopy M>>

保留由

指示的注释类型引用/坐标/路径数据
0: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1
1: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1, location=[TYPE_ARGUMENT(0)]
2: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1, location=[TYPE_ARGUMENT(0), WILDCARD, TYPE_ARGUMENT(0)]

是什么导致类签名相交的第二部分丢失注释的内部位置?

最佳答案

我发现这似乎是由 eclipse (特别是 MARS)使用的任何编译器引起的。 使用 javac 编译后,得到以下 javap 输出:

0: #8(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1
1: #8(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1, location=[TYPE_ARGUMENT(0)]
2: #8(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1, location=[TYPE_ARGUMENT(0), WILDCARD, TYPE_ARGUMENT(0)]
3: #8(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2
4: #8(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2, location=[TYPE_ARGUMENT(0)]
5: #8(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2, location=[TYPE_ARGUMENT(0), TYPE_ARGUMENT(0), WILDCARD]
6: #8(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=3

忽略 Eclipse 扔到常量池中的额外内容(因此是 #8(来自 javac 版本)而不是 #10(来自 eclipse 版本)),我们现在可以看到,当使用 javac 编译时,相交的第 2 部分现在拥有其所有坐标数据。

如果有人知道 Eclipse 编译器配置中的任何内容可能导致它删除位置数据(即某种奇怪的优化形式),请告诉我,否则我会将其报告为错误。

关于java - 类型注释位置删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34504562/

相关文章:

java - 检查Java中是否存在枚举

java - 无参数构造函数的替代品

ios - 什么是 ___lldb_unnamed_symbol?

Windows 单向链表 (_SINGLE_LIST_ENTRY)

java - JVM字节码中的NOP是干什么用的?

java - 在MarkLogic中存储父子关系

java - 为什么这个类中的某些构造函数使用 this(context) 而不是 super(context)?

python - 如何记录 Python 程序执行的 CPU 指令?

javascript - nodejs/V8 是否将编译后的机器代码存储在磁盘上的任何位置?

scala - 为什么隐式值类有一个额外的方法调用?