Java 不同类型属性在字节码文件class中

来源:互联网 发布:java gbk转utf8 乱码 编辑:程序博客网 时间:2024/05/18 02:07

1. Object Attribute

  • souce code

public class ObjectAttribute

{

    public int intValue = 0;

    public String stringValue = "testString" ;

    public Integer integerValue = 0;

}

  • class file

--> Constant pool

     会出现CONSTANT_Fieldref_info条目,其中包含了属性的类目和名称类型

      such as:

      [16] CONSTANT_Fieldref_info

      Class name: cp_info #1 <variable/ObjectVariable>

      Name and type: cp_info #21 <stringValue Ljava/lang/String>

--> Fields

      如下,有对应的属性相关的描述

      [1] stringValue

      Name: cp_info #7 <stringValue>

      Descriptor: cp_info #8 <Ljava/lang/String;>

      Access flags: 0x0001 [public]

 

2. Final Object Attribute

  • source file

public class FinalObjectAttribute

{

    public final int intValue = 0;

    public final String stringValue = "fStringValueString";

    public final Integer integerValue = 0;

    public final double doubleValue ;

   

    public FinalObjectAttribute(){

        doubleValue = 1.1;

    }

}

 

  • class file   

--> Constant pool

      和其它的类型一样

--> Fields

      相对于非Final的对象属性,intValuestringValue有一个ConstantValue属性。请注意只有基本类型和String类型在定义时有初始化值时,才有ConstantValue属性。 integerValue虽然定义了初始化值但它没有ConstantValue属性。

      such as [0] intValue           

      Generic info:

             Attribute name index: cp_info #7<ConstantValue>

             Attribute length: 2

      Specific info:

              Constant value index: cp_info #8 <0>

--> Method

      在构造函数init中,只有integerValue和doubleValue初始化代码。intValue和stringValue都没有出现。

 

3. class Attribute

  • source file

publicclassStaticObjectAttribute

{

    publicstatic int intValue = 0;

    publicstatic StringstringValue ="stringValueString";

    publicstatic IntegerintegerValue = 0;

    publicstatic doubledoubleValue;

 

    static{

        doubleValue = 19;

    }

}

  • class file

--> Constant pool

      和其它类型类似

--> Fields

      除了 access flags0x0009 [public static]其它和非finalObject Attribute

      such as 

       [0] intValue

      Name: cp_info #5 <intValue>

      Descriptor: cp_info #6 <I>

      Access flags: 0x0009 [public static]

--> Method

      有一个cinit方法来初始化类属性。

           

4. Final Class Attribute

  • source code

public class FinalClassVariable

{

    publicfinalstaticintintValue = 0;

    publicfinalstatic StringstringValue ="stringValueString";

    publicfinalstatic IntegerintegerValue = 0;

    publicfinalstaticdoubledoubleValue;

 

    static{

        doubleValue = 19;

    }

}

  • class file

--> Constant pool

     和其它类型对象类似

--> Fields

     和Final对象属性类似,但access flags0x0019 [public static final]. ConstantValue attributes也和Final对象类似

--> Method

      cinit函数和非finalclass属性类似           

 

总结:

     对于类属性的初始化是在cinit方法中,而对象属性的初始化是在init方法中。

     对于Final类型,基本类型(int, long,…)String类型如果在定义是有初始化值,会有一个ConstantValue属性,而且这些类型的属性不会出现在cinit方法和init方法(如果没有explicitly在静态初始化代码块或者构造函数中引用)。

 

0 0
原创粉丝点击