1.产生

源码(.java文件)——>编译器(如:javac)——>字节码(.class文件)——>虚拟机(如:HotSpot)执行

2.Class文件

 1)构成:

                    魔数、版本号、常量池、访问标志、索引、字段表集合、方法表集合、Signature属性表、SourseFile属性表

 2)例子:

[1] .java文件

桌面/test/test/Father.java、桌面/test/test/Father_interface.java、桌面/test/Son.java  ;

[2]编译出.class文件

cd  桌面/test;

桌面/test>javac  Son.java;

[3]查看.class文件

桌面/test>javap -verbose  Son;

Classfile /C:/Users/Administrator/Desktop/test/Son.class
  Last modified 2016-4-11; size 1005 bytes
  MD5 checksum 7d138d76267a6bb372eba05296e2c932魔数
  Compiled from "Son.java"
接口索引,指向常量池
  SourceFile: "Son.java" 源码属性表<源码名称,指向常量池>
  minor version: 0
  major version: 51主板本号
  flags: ACC_PUBLIC, ACC_SUPER访问标志<当前类>
Constant pool:常量池  一、符号引用{
   #1 = Methodref          #16.#33        //  test/Father."<init>":()V
   #2 = Fieldref           #15.#34        //  test/Son.sId_literal:I                 《字段》符号引用
   #3 = Fieldref           #35.#36        //  java/lang/System.out:Ljava/io/PrintStream;
   #4 = Class              #37            //  java/lang/StringBuilder                类/接口》符号引用
   #5 = Methodref          #4.#33         //  java/lang/StringBuilder."<init>":()V   《类方法》符号引
   #6 = String             #38            //  statical_sId =                          《字面量——静态字段》符号引用
   #7 = Methodref          #4.#39         //  java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/Strin
gBuilder;
   #8 = Fieldref           #15.#40        //  test/Son.statical_sId:I
   #9 = Methodref          #4.#41         //  java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
  #10 = Methodref          #4.#42         //  java/lang/StringBuilder.toString:()Ljava/lang/String;
  #11 = Methodref          #43.#44        //  java/io/PrintStream.println:(Ljava/lang/String;)V
  #12 = String             #45            //  Son实例构造器!                           《字面量——System.out的字符串》符号引用
  #13 = String             #46            //  hello!this is son!
  #14 = String             #47            //  Son类构造器<clinit>执行!
  #15 = Class              #48
  #16 = Class              #49
  #17 = Class              #50            //  test/Father_interface 3    }

  二、常量类型{                         
  #18 = Utf8               final_sId    UTF-8编码的字符串
  #19 = Utf8               I
  #20 = Utf8               ConstantValue
  #21 = Integer                      整型字面量
  #22 = Utf8               statical_sId
  #23 = Utf8               sId_literal
  #24 = Utf8               sId_nonLiteral
  #25 = Utf8               <init>
  #26 = Utf8               ()V   /**返回类型*/
  #27 = Utf8               Code
  #28 = Utf8               LineNumberTable
  #29 = Utf8               sayHello
  #30 = Utf8               <clinit>
  #31 = Utf8               SourceFile
  #32 = Utf8               Son.java       

    }  三、符号引用、数据{
  #33 = NameAndType        #25:#26        //  "<init>":()V   《字段/方法部分》符号引用
  #34 = NameAndType        #23:#19        //  sId_literal:I
  #35 = Class              #51            //  java/lang/System
  #36 = NameAndType        #52:#53        //  out:Ljava/io/PrintStream;
  #37 = Utf8               java/lang/StringBuilder
  #38 = Utf8               statical_sId =
  #39 = NameAndType        #54:#55        //  append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  #40 = NameAndType        #22:#19        //  statical_sId:I
  #41 = NameAndType        #54:#56        //  append:(I)Ljava/lang/StringBuilder;
  #42 = NameAndType        #57:#58        //  toString:()Ljava/lang/String;
  #43 = Class              #59            //  java/io/PrintStream
  #44 = NameAndType        #60:#61        //  println:(Ljava/lang/String;)V
  #45 = Utf8               Son实例构造器!   }符号引用
  #46 = Utf8               hello!this is son!
  #47 = Utf8               Son类构造器<clinit>执行!
  #48 = Utf8               test/Son
  #49 = Utf8               test/Father
  #50 = Utf8               test/Father_interface
  #51 = Utf8               java/lang/System
  #52 = Utf8               out
  #53 = Utf8               Ljava/io/PrintStream;
  #54 = Utf8               append
  #55 = Utf8               (Ljava/lang/String;)Ljava/lang/StringBuilder;
  #56 = Utf8               (I)Ljava/lang/StringBuilder;
  #57 = Utf8               toString
  #58 = Utf8               ()Ljava/lang/String;
  #59 = Utf8               java/io/PrintStream
  #60 = Utf8               println
  #61 = Utf8               (Ljava/lang/String;)V
{
  public test.Son();方法表——实例构造器
    flags: ACC_PUBLIC
    Code:
      stack=3, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method test/Father."<init>":()V
         4: aload_0
         5: bipush        123
         7: putfield      #2                  // Field sId_literal:I
        10: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
        13: new           #4                  // class java/lang/StringBuilder
        16: dup
        17: invokespecial #5                  // Method java/lang/StringBuilder."<init>":()V
        20: ldc           #6                  // String statical_sId =
        22: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/
lang/StringBuilder;
        25: getstatic     #8                  // Field statical_sId:I
        28: invokevirtual #9                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilde
r;
        31: invokevirtual #10                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        34: invokevirtual #11                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        37: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
        40: ldc           #12                 // String Son实例构造器!
        42: invokevirtual #11                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        45: sipush        333
        48: putstatic     #8                  // Field statical_sId:I
        51: return
      LineNumberTable:
        line 15: 0
        line 7: 4
        line 16: 10
        line 17: 37
        line 18: 45
        line 19: 51

  public void sayHello();方法表——sayHello()
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #13                 // String hello!this is son!
         5: invokevirtual #11                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return
      LineNumberTable:
        line 21: 0
        line 22: 8

  static {};方法表——类构造器(静态代码块)
    flags: ACC_STATIC
    Code:
      stack=3, locals=0, args_size=0
         0: bipush        123
         2: putstatic     #8                  // Field statical_sId:I
         5: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
         8: new           #4                  // class java/lang/StringBuilder
        11: dup
        12: invokespecial #5                  // Method java/lang/StringBuilder."<init>":()V
        15: ldc           #6                  // String statical_sId =
        17: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/
lang/StringBuilder;
        20: getstatic     #8                  // Field statical_sId:I
        23: invokevirtual #9                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilde
r;
        26: invokevirtual #10                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        29: invokevirtual #11                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        32: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
        35: ldc           #14                 // String Son类构造器<clinit>执行!
        37: invokevirtual #11                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        40: return
      LineNumberTable:
        line 6: 0
        line 11: 5
        line 12: 32
        line 13: 40
}

3.分析

魔数 版本号 常量池   访问标志 索引 字段表集合                                                                           

因为后缀名是可以改的,所以

用它来确定真的是.class文件

44=JDK1.0

45=jdk1.1

....

字面量

基本类型数据值      

<int、double等>

符号引用

<指向UTF-8字符串>

记录类信息

访问标志

全限定名

记录方

简单名称

返回类型

参数列表 

记录成员属性

简单名称

访问标志

返回类型

 

本类索引

继承父类索引

实现接口索引

<指向”常量池“符号引用, 记录类信息>

每张表:           

        访问标志      

 //指向常量池-符号引用-成员

     名称

        描述            返回类型

//指向常量池-符号引用-成员

        附加属性表

————ConstantValue表

静态成员才有此属性表,如果被final修饰,就直接把取值(常量池-字面量)写到表中

————Signature表    

                        //记录泛型信息

方法表集合

     Signature表

SourseFile属性表

每张表:

访问标志

 //指向常量池-符号引用-方法

名称

描述

返回类型、参数列表

//指向常量池-符号引 用-方法

附加属性表

————Code表

 虚拟机字节码指令     (方法内容,抽象方  法无此属性表) 

————Linumber表

————局部变量表

————异常表

————Signature表

记录泛型信息

  

       记录本类泛型信息

表1

    <本类>

     对应源码文件名称索引                  

表2:

    <内部类>

    对应源码文件名称索引

....

4.相关术语

1)特征签名

-方法表中所有“参数-描述”的集合,指向常量池的符号引用

2)元数据

-方法、字段、类和包的描述信息(即字节码中非虚拟机字节码指令部分)

3)<client>()方法

·定义:

-即“类构造器”,是由编译器自动收集类中类变量的赋值和静态语句块中语句合并产生,在编译过程中,由编译器将该方法的bit流写入.Class文件。

·例子:

-收集“类变量的赋值”

Person.java文件:static int i =20;——————>Person.Class文件: static Person{ int i =20;}

-收集“静态语句块中语句”

Person.java文件:static {Person.i =50;}——————>Person.Class文件: static Person{ int i =20; i =50;}

·性质:

-按在.java源文件中出现的顺序,依次进行收集;

-“类构造器”并不是必须被产生的,因为一个类或接口可以没有静态语句块和类变量的赋值操作;

-接口也中可以有“类构造器”,因为从语法上,虽然接口中不能含static{}静态代码块,但是可以含“类变量的赋值”;

读《深入理解Java虚拟机》有感——第一部分:Class文件的结构的更多相关文章

  1. 【深入理解JAVA虚拟机】第一部分.走进Java

    Java技术体系 如果仅从传统意义上来看,Sun官方所定义的Java技术体系包括以下几个组成部分:Java程序设计语言各种硬件平台上的Java虚拟机Class文件格式Java API类库来自商业机构和 ...

  2. 深入理解Java虚拟机(第2版) 笔记目录

    本篇为读深入理解Java虚拟机(第2版)一书的笔记目录. Java 运行期数据区 Java 垃圾回收算法 Java 内存分配策略 Java 类文件结构 Java 加载.链接.初始化 Java 类加载器

  3. 读《深入理解Java虚拟机》

    Java虚拟机运行时数据区 对象的创建 Java创建对象,在语言层面上使用new关键字.虚拟机遇到new关键字时,会检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的 ...

  4. 深入理解Java虚拟机--下

    深入理解Java虚拟机--下 参考:https://www.zybuluo.com/jewes/note/57352 第10章 早期(编译期)优化 10.1 概述 Java语言的"编译期&q ...

  5. 《深入理解Java虚拟机》-----第6章 类文件结构——Java高级开发必须懂的

    代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步. 6.1 概述 记得在第一节计算机程序课上我的老师就讲过:“计算机只认识0和1,所以我们写的程序需要经编译器翻 ...

  6. 深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)

    目录 1.类文件结构 1.1 Class类文件结构 1.2 魔数与Class文件的版本 1.3 常量池 1.4 访问标志 1.5 类索引.父索引与接口索引集合 1.6 字段表集合 1.7 方法集合 1 ...

  7. jvm--深入理解java虚拟机 精华总结(面试)(转)

    深入理解java虚拟机 精华总结(面试)(转) 原文地址:http://www.cnblogs.com/prayers/p/5515245.html 一.运行时数据区域 3 1.1 程序计数器 3 1 ...

  8. 2018.4.23 深入理解java虚拟机(转)

    深入理解java虚拟机 精华总结(面试) 一.运行时数据区域 Java虚拟机管理的内存包括几个运行时数据内存:方法区.虚拟机栈.本地方法栈.堆.程序计数器,其中方法区和堆是由线程共享的数据区,其他几个 ...

  9. 《深入理解Java虚拟机》学习笔记

    <深入理解Java虚拟机>学习笔记 一.走近Java JDK(Java Development Kit):包含Java程序设计语言,Java虚拟机,JavaAPI,是用于支持 Java 程 ...

随机推荐

  1. 使用Jsoup解析html网页

    一.   JSOUP简介 在以往用java来处理解析HTML文档或者片段时,我们通常会采用htmlparser(http://htmlparser.sourceforge.net/)这个开源类库.现在 ...

  2. 研究jdk关于TreeMap 红黑树算法实现

    因为TreeMap的实现方式是用红黑树这种数据结构进行存储的,所以呢我主要通过分析红黑树的实现在看待TreeMap,侧重点也在于如何实现红黑树,因为网上已经有非常都的关于红黑树的实现.我也看了些,但是 ...

  3. mysql 5.6到percona 5.6小版本升级

    假设原来是mysql 5.6.19社区版,现在要升级到percona server 5.6.30. 对于大的数据库来说,采用mysqldump方式进行迁移太花费时间了,可采用新安装加载原来数据库的方式 ...

  4. Eclipse下Android开发的问题:Failed to install AndroidPhone.apk on device 'emulator-5554': timeout 解决办法

    在window->preferences->Android->DDMS->ADB connection time out (ms): 将这个值设置的大一些,默认为5000,我设 ...

  5. 删除单链表倒数第n个节点

    基本问题 如何删除单链表中的倒数第n个节点? 常规解法 先遍历一遍单链表,计算出单链表的长度,然后,从单链表头部删除指定的节点. 代码实现 /** * * Description: 删除单链表倒数第n ...

  6. webform(内置对象)

    一.内置对象 (一)Response - 响应请求对象1.定义:Response对象用于动态响应客户端请示,控制发送给用户的信息,并将动态生成响应.Response对象只提供了一个数据集合cookie ...

  7. ASP.NET本质论第一章网站应用程序学习笔记3-对象化的Http

    在.NET环境下,万物皆对象,在HttpRuntime收到请求之后,立即将通过HttpWorkerRequest传递的参数进行分析和分解,创建方便用于网站应用程序处理用的对象,其中主要涉及到两个对象类 ...

  8. ArcGIS的许可文件问题

    ArcGIS我是从9.3版本开始使用的,当时破解非常麻烦,容易出现各种问题,当时生成的许可文件是一个单独的exe:后来10版本甚至10.1都出来,我还是使用的那个exe来生成许可文件,正常使用没有问题 ...

  9. Convert part to feature command

    Search 库主页 Related Links ArcObjects SDK for ArcGIS 10Microsoft Help System Documentation Convert par ...

  10. Microsoft Dynamics CRM 2013 --选项集的多选

    由于从Microsoft Dynamics CRM 2011到Microsoft Dynamics CRM 2013,界面的风格发生了很大的变化 故原先在2011上开发的选项集多选在2013上面已经不 ...