类文件常量池(javap)中的方法签名和描述符

类文件常量池(javap)中的方法签名和描述符,java,.class-file,javap,Java,.class File,Javap,我试图找出类文件中常量池部分下的以下两个条目: int foo(int x) { return x; } #11 = Utf8 foo #12 = Utf8 (I)I // 1 #13 = Utf8 x #14 = Utf8 I // 2 条目1->II是否表示函数的开始,以及 条目2->I表示函数结束 此编译器是特定的还是可能因编译

我试图找出类文件中常量池部分下的以下两个条目:

int foo(int x) {
    return x;
}

#11 = Utf8               foo
#12 = Utf8               (I)I        // 1   
#13 = Utf8               x
#14 = Utf8               I           // 2
条目1->II是否表示函数的开始,以及 条目2->I表示函数结束

此编译器是特定的还是可能因编译器而异

Lambda函数也有类似的问题

interface I { int foo(int x); }
class X {
I x = (int x1) -> 0;
}

 #15 = Utf8            lambda$new$0
 #16 = Utf8            (I)I
 #17 = Utf8            x1
 #18 = Utf8            I
抱歉,在JLS文档中找不到任何内容


感谢

常量池没有方法开始和方法结束的概念

这里实际看到的是字符串常量,常量池中的类型为Utf8。从池的角度来看,这些只是字符串——然而,它们是编译器生成的字符串,代表各种事物。这些字符串是必需的,它们的格式在JVM中有描述。有几种类型。从您的lambda示例中:

lambda$new$0-这是一个签名,如中所述。 II-这是一个与签名不同的方法描述符,如中所述 I-这是一个字段描述符,如中所述。 简单的I条目只是int类型的字段

对于您的I I条目。。是参数类型。它可以是一个列表。I是基元类型int。在..之外的字符串。。是返回类型。所以我描述了一个方法,它的参数列表接受int,返回类型为int

具体而言,在JVM中,方法描述符字符串的格式如下:

MethodDescriptor:
    ( ParameterDescriptor* ) ReturnDescriptor

ParameterDescriptor:
    FieldType

ReturnDescriptor:
    FieldType
    VoidDescriptor

VoidDescriptor:
    V
其中FieldType来自:

它们引用方法名称字符串和描述符字符串


javap文档本身非常稀疏,只包含命令行信息。JVM是最接近javap的详细手册。

常量池没有方法开始和方法结束的概念

这里实际看到的是字符串常量,常量池中的类型为Utf8。从池的角度来看,这些只是字符串——然而,它们是编译器生成的字符串,代表各种事物。这些字符串是必需的,它们的格式在JVM中有描述。有几种类型。从您的lambda示例中:

lambda$new$0-这是一个签名,如中所述。 II-这是一个与签名不同的方法描述符,如中所述 I-这是一个字段描述符,如中所述。 简单的I条目只是int类型的字段

对于您的I I条目。。是参数类型。它可以是一个列表。I是基元类型int。在..之外的字符串。。是返回类型。所以我描述了一个方法,它的参数列表接受int,返回类型为int

具体而言,在JVM中,方法描述符字符串的格式如下:

MethodDescriptor:
    ( ParameterDescriptor* ) ReturnDescriptor

ParameterDescriptor:
    FieldType

ReturnDescriptor:
    FieldType
    VoidDescriptor

VoidDescriptor:
    V
其中FieldType来自:

它们引用方法名称字符串和描述符字符串


javap文档本身非常稀疏,只包含命令行信息。JVM是最接近javap的详细手册。

这让人尴尬。我应该认为我是整数。谢谢。@JasonC当我回到计算机前,我必须检查它的确切含义,但它就是这么描述的。@Jason实际上他是对的。这些是该方法引用的常量池条目。这不是调试信息-每个方法都必须有一个名称和描述符。@Jason我已经看过了。你能补充一下这些细节吗?我现在不能补充。这很尴尬。我应该认为我是整数。谢谢。@JasonC当我回到计算机前,我必须检查它的确切含义,但它就是这么描述的。@Jason实际上他是对的。这些是该方法引用的常量池条目。这不是调试信息-每个方法都必须有一个名称和描述符。@Jason我已经看过了。你能补充一下这些细节吗?我现在不能补充?
#123 = NameAndType      #11:#12;   // "foo":(I)I