JVM

26-class文件结构

2021-06-24  本文已影响0人  紫荆秋雪_文

一、概述

JVM规范的字节码

二、Java的前端编译器

三、通过字节码指令了解代码细节


/**
 *  字节码开代码细节
 */
public class IntegerClassTest {

    public static void main(String[] args) {
        Integer r1 = 5;
        int r2 = 5;
        System.out.println(r1 == r2);

        Integer r3 = 10;
        Integer r4 = 10;
        System.out.println(r3 == r4);

        Integer r5 = 128;
        Integer r6 = 128;
        System.out.println(r5 == r6);

    }
}
true
true
false
/**
 *  int类型的值 -> Integer类型
 *  static final int low = -128;
 *  static final int high = 127;
 *  static final Integer cache[]:range [-128, 127] must be interned (JLS7 5.1.7)
 */
public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
}
    private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

四、Class文件

1、字节码文件里是什么?

2、什么是字节码指令(byte code)

 0 iconst_5
 1 invokestatic #2 <java/lang/Integer.valueOf>
 4 astore_1
 5 iconst_5
 6 istore_2  // 只有操作码,不包含操作数
 7 getstatic #3 <java/lang/System.out>  // 既有操作码,又有操作数
10 aload_1
11 invokevirtual #4 <java/lang/Integer.intValue>
14 iload_2
15 if_icmpne 22 (+7)

3、解读供虚拟机解释执行的二进制字节码 image.png

4、Class类的本质

5、Class文件格式

/**
 * Class文件结构
 */
public class ClassDemoTest {
    private int num = 1;
    public int add() {
        num += 2;
        return num;
    }
}

6、Class文件结构概述

7、Magic Number 魔数

8、版本号

9、常量池:存放所有常量

1、常量池计数器(constant_pool_count)
2、常量池表(constant_pool [])

10、字面量和符号引用

1、全限定名
2、简单名称
3、描述符
4、常量类型和结构
5、总结1
6、总结2

11、访问标识(access_flag、访问标志、访问标记)

image.png

12、类索引、父类索引、接口索引集合

1、this_class(类索引)
2、super_class(父类索引)
3、Interface

13、字段表集合

1、fields
2、fields_count(字段计数器)
3、fields[](字段表)
4、字段表访问标识 image.png
5、字段名索引
6、描述符索引
7、属性表集合

14、方法表集合

1、methods_count(方法计数器)
2、methods
3、方法表访问标志
image.png

15、属性表集合(attributes)

1、attributes_count(属性计数器)
2、attributes [] (属性表)
3、属性的通用格式
4、属性类型

15、部分属性详解

1、ConstantValue 属性
ConstantValue_attribute {
  u2  attribute_name_index;
  u4  attribute_length;
  u2  constantvalue_index;  //  字段值在常量池中的索引,常量池在该索引处的项给出该属性表示的常量值
}
2、Deprecated 属性
Deprecated_attribute {
  u2  attribute_name_index;
  u4  attribute_length;
}
3、Code 属性
4、InnerClasses 属性
5、LineNumberTable 属性
6、LocalVariableTable 属性
7、Signature 属性
8、SourceFile 属性
image.png
9、其他属性
上一篇下一篇

猜你喜欢

热点阅读