Java字节码签名

作为我正在编写的编程语言的编译器的一部分,我在字节码中遇到了通用签名,我试图解析并转换为AST。 解析算法大多数都有效,但似乎有一种特殊情况,这些签名的格式有点奇怪。 以下是一些这样的情况:

java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable;>([TT;)V java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable;>([TT;II)V java.lang.Class#getAnnotation: (Ljava/lang/Class;)TA; java.lang.Class#getAnnotationsByType: (Ljava/lang/Class;)[TA; java.lang.Class#getDeclaredAnnotation: (Ljava/lang/Class;)TA; java.lang.Class#getDeclaredAnnotationsByType: (Ljava/lang/Class;)[TA; java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable;>([TT;)V java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable;>([TT;II)V java.util.Collections#sort: <T::Ljava/lang/Comparable;>(Ljava/util/List;)V 

在这些类中的所有方法中,这些是唯一在其签名中具有::的方法。 我的问题是这个令牌的作用以及它存在的原因。

编辑

我知道Java语言中::运算符,但这是字节码级别的东西。

从JSR 14开始,有一个已定义的语法已更改,以指定generics类型的边界。

 variable_name:class_type_bound:interface_type_bounds 

所以对于你的例子:

 ;> 

这将反映:

 > 

变量名是T ,没有绑定的类类型,因此省略了它,并且有一个类型为Comparable的接口绑定。

你的所有例子都遵循这个,但有许多不同的forms:

 (Ljava/util/Collection;)TT; (Ljava/util/Collection;)TT; ;)TT; 

资源