【问题标题】:Type Annotation Location Erasure类型注释位置擦除
【发布时间】:2016-04-02 22:54:34
【问题描述】:

我目前遇到了一个奇怪的情况,其中一些 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>>

保留其注释类型参考/坐标/路径数据,由

指示
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)]

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

【问题讨论】:

    标签: java reverse-engineering bytecode


    【解决方案1】:

    我发现这似乎是由 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 版本))我们现在可以看到 intersect 的第 2 部分现在具有其所有坐标数据使用 javac 编译时。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      相关资源
      最近更新 更多