Java字节码签名

5
作为我正在开发的编程语言编译器的一部分,我遇到了字节码中的通用签名,我正在尝试解析并将其转换为AST。解析算法大多数情况下都能正常工作,但似乎存在一种特殊情况,其中这些签名的格式表现得有点奇怪。以下是其中的几个案例:
java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable<-TT;>;>([TT;)V
java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable<-TT;>;>([TT;II)V
java.lang.Class#getAnnotation: <A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)TA;
java.lang.Class#getAnnotationsByType: <A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)[TA;
java.lang.Class#getDeclaredAnnotation: <A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)TA;
java.lang.Class#getDeclaredAnnotationsByType: <A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)[TA;
java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable<-TT;>;>([TT;)V
java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable<-TT;>;>([TT;II)V
java.util.Collections#sort: <T::Ljava/lang/Comparable<-TT;>;>(Ljava/util/List<TT;>;)V

在这些类的所有方法中,只有这些方法在其签名中有 ::。我的问题是这个标记是做什么的,为什么它存在。

编辑

我知道在Java语言中有::运算符,但这是在字节码级别上的问题。


我的猜测是这与泛型有关。 - k_g
在实现正式语言的解析器时,您应该始终首先参考该语言的官方规范 - Holger
1个回答

9
自JSR 14以来,已经定义了一种语法来指定通用类型的范围。
variable_name:class_type_bound:interface_type_bounds

因此,以您的示例为例:

<T::Ljava/lang/Comparable<-TT;>;>

这将反映:

<T extends Comparable<T>>

变量名为T,没有类类型约束,因此被省略了,同时有一个类型为 Comparable<T> 的接口约束。
您的所有示例都遵循此规则,但还有许多不同形式:
<T:Ljava/lang/Object;>(Ljava/util/Collection<TT;>;)TT;
<T::Ljava/lang/Comparable;>(Ljava/util/Collection<TT;>;)TT;
<T:Ljava/lang/Object;:Ljava/lang/Comparable;(Ljava/util/Collection<TT;>;)TT;

Source


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接