• 深入理解java虚拟机(3)---类的结构


      计算机在开始的时候,只认识0和1,所以汇编语言是和机器结构或者说CPU绑定的。ARM体系结构就是这样一种体现,指令集的概念。

    随着高级语言的出现,从字编码发展到了字节编码,计算机的先驱希望能够让语言能够脱离语言的环境,从而程序员只要开发代码,而无需适配设备。

    java语言就是这样被创建了。java通过虚拟机这样一个中间件,由它来沟通语言和操作系统间的联系,从而使java可以跨平台使用。虚拟机的设计不

    仅仅是只供java使用,而是对于其他语言,在未来,也可以提供平台无关性的体验。所以虚拟机处理的不是".java"文件,而是".class"文件。

      class文件结构:

      class文件结构,是一个标准的格式。对于class的文件的了解,并不是我们的目的。所以这部分只是必要的了解就可以了。

      

    1.class结构与魔数

    魔数的作用是确定文件格式是唯一判定虚拟机可以接受的文件类型。

    class文件的魔数是0xCAFEBABY.

    然后是版本号:5-6位是次版本号,而7-8位是主版本号。java版本是从45开始的,java1.1 能支持45.0~45.65535 而java1.7 就是51.0

    其实jdk就带有分析工具javap

    javap可以很好的分析class内容的结构。

    所以具体如何分析class结构,本文不会介绍。

    2.常量池

    常量池存放2类东西,字面量和符号引用。

    常亮池的入口,是u2类型的数据,代表常量池的容量的计数值。

    这个设计同很多计算机中的规范类似。

    字面量接近java的概念,文本字符串和final的常量。

    符号引用:

    类和接口的全限定名

    字段名称和描述符

    方法的名称和描述符

    java的class不会保存各个方法,字段的最终内存布局。也就是说,当JVM运行时,需要从常量池里面获取对应的符号引用,

    在类创建或者运行时解析,翻译到具体的内存地址。

    常量池的每一种常量都是一个表结构。

    先看一个简单的例子:

    如何定义class的信息。

    先看这张图,这是一个典型的类文件:

    首先我们看到0x00000032,所以这个java的版本是50.0 对应的就是java1.6

    后面0x16 代表的是22, 此处需注意:常量池的计数是从1开始的,也就是常量池中一共有21个常量结构。

    先看第一个 0x07,对应的是:class类型。具体更多类型,可以参考 相关书籍介绍。(书籍本文后面会介绍)

    简单来说,classinfo 就1个东西,class name。

    图上的位置就是 0x0002,也就是指向了常量池的第二个常量。

    第二个常量池的标志是0x01, 也就是字符串常量。

    最终结果就是上面一节 javap分析出来的内容。

    它的内容,明显就是上面看到的那串字符。“org/fenixsoft/clazz/TestClass” . 这就是class的name。

    其他常量也可通过类型过程分析出来。

    javap可以直接帮我们分析常量池。

    3.访问标志

    第一时间想到的是:public, private, protected . 还有final,static。

    但是这是一个“类”的限定,所以还会有其他类型的访问标志。

    目前只定义的8种。

    可以看到:interface,enum,注解等东东,从编译器的角度来讲,都是差不多的。

    4.类索引,父类索引 和接口索引。

    一个类, 只有一个父类,并且有0~n个接口。

    所以。类的索引,就是 当前类的信息,父类信息,接口信息。

    这3个索引是连在一起的。

    前2个表示在常量池中的位置,后面一个表示接口的个数。

    5.字节码指令

    早些年看《计算机组成与设计硬件/软件接口》一书的时候,非常过瘾,任何高级语言 最终的流向就是指令级,或者说CPU操作指令。

    而计算机本质上只认识0 & 1,所以 简单可以理解为,java语言编译后,编程字节指令,然后经CPU处理。

    所以此处就不介绍这部分内容。

  • 相关阅读:
    守护进程-锁-队列(生产者消费者模型)
    正则表达式不包含某个字符串写法
    正则表达式匹配不包含某些字符串的技巧
    08.参数估计_点估计
    07.编程理解中心极限定理
    05.编程理解小数和大数定律
    03.描述性统计代码
    02.描述统计 (descriptive statistics)
    oracle之三手工不完全恢复
    oracle之三手工完全恢复
  • 原文地址:https://www.cnblogs.com/deman/p/5104646.html
Copyright © 2020-2023  润新知