类型注释位置擦除

时间:2015-12-29 04:46:13

标签: 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>>

似乎所有的TypeParameter Annotations都指向一个位置,由

表示
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>>

保留由

指示的注释typeref / coordinate / path数据
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)]

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

1 个答案:

答案 0 :(得分: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版本))我们现在可以看到相交的第2部分现在具有所有的坐标数据用javac编译时。

如果有人知道eclipse编译器配置中的任何内容可能导致它擦除位置数据(即一些奇怪的优化形式)让我知道,否则我会将此报告为错误。