2016-12-09 1 views
1

-vてjavapで "署名" とは何か、私はこのような出力が得られます。てjavap -vを使用して

Classfile /C:/temp/classcompare/PartnerRolle.class 
    Last modified 09.12.2016; size 2880 bytes 
    MD5 checksum 2deeeaa2734ac86f673bba871c05a997 
    Compiled from "PartnerRolle.java" 
public final class de.continentale.vs.common.model.enums.PartnerRolle extends java.lang.Enum<de.continentale.vs.common.model.enums.PartnerRolle> 
    Signature: #110       // Ljava/lang/Enum<Lde/continentale/vs/common/model/enums/PartnerRolle;>; 
    SourceFile: "PartnerRolle.java" 
    minor version: 0 
    major version: 51 
    flags: ACC_PUBLIC, ACC_FINAL, ACC_SUPER, ACC_ENUM 

"署名#110" を意味し何?

背景:AntとMaven(同じJavaバージョン)を使用してコンパイルするとき、同じJavaソースに対して異なるクラスファイルを取得しています。私は理由を理解しようとしています。

答えて

1

javap -vは、javap -verboseに相当します。

クラスファイル形式は、JVM仕様で定義されています。 あなたは一部4.7.9. The signature attributeを見ればあなたが署名の属性は固定長クラスファイルの属性テーブル内の属性、field_info、またはmethod_info構造であるSignature

の定義を見つけることができます。 Signature属性は、Javaプログラミング言語の宣言が型変数またはパラメータ化された型を使用するクラス、インタフェース、コンストラクタ、メソッド、またはフィールドのシグネチャを記録します。 [...]

署名属性の形式は以下のように

Signature_attribute { U2のattribute_name_indexと、u4 attribute_length;u2 signature_index;次のように }

Signature_attribute構造の項目は次のとおり

attribute_name_index

はattribute_name_index項目の値はconstant_poolテーブルに有効なインデックスでなければなりません。そのインデックスのconstant_poolエントリは、文字列 "Signature"を表すCONSTANT_Utf8_info構造体(§4.4.7)でなければなりません。

attribute_length

Signature_attribute構造のattribute_length項目の値は2でなければなりません。

signature_index

signature_index項目の値はconstant_poolテーブルに有効なインデックスでなければなりません。そのインデックスのconstant_poolエントリは でなければならない。このSignature属性がClassFile構造体の属性である場合、クラス署名 を表すCONSTANT_Utf8_info構造体(§4.4.7)。 このシグネチャ属性が method_info構造体の属性である場合、メソッドシグネチャ。またはそうでなければフィールド署名である。

Signature #110は、シグネチャが定数プールテーブルのインデックス110に保存されていることを示します。

1

"署名"は、対応するクラスまたはメソッドの一般的な型署名です。 "Signature:#110"は、このクラスのシグネチャが.classファイルの定数プールエントリ#110として保存されていることを意味します。

"署名"属性の値として使用される文字列の形式は、JVM specificationに記載されています。

関連する問題