一个Java程序是怎样运行起来的【class解析全过程】(2)

简介: 一个Java程序是怎样运行起来的【class解析全过程】(2)

常量池中的项目类型有:

CONSTANT_Utf8_info      tag标志位为1,   UTF-8编码的字符串,比如类或接口的全限定名,参数名等

CONSTANT_Integer_info  tag标志位为3, int整型字面量

CONSTANT_Float_info     tag标志位为4, float浮点型字面量

CONSTANT_Long_info     tag标志位为5, long长整形字面量

CONSTANT_Double_info  tag标志位为6, double双精度字面量

CONSTANT_Class_info    tag标志位为7, 类或接口的符号引用,指向包含字符串字面值的CONSTANT_Utf8表

CONSTANT_String_info    tag标志位为8,字符串类型的字面量,指向包含字符串字面值的CONSTANT_Utf8表

CONSTANT_Fieldref_info  tag标志位为9,  字段的符号引用,指向包含该字段所属类名的CONSTANT_Utf8表

CONSTANT_Methodref_info  tag标志位为10,类中方法的符号引用,指向包含该方法所属类型的CONSTANT_Utf8表

CONSTANT_InterfaceMethodref_info tag标志位为11, 接口中方法的符号引用

CONSTANT_NameAndType_info  tag 标志位为12,字段和方法的名称以及类型的符号引用


3.2常量池内容


接上,继续分析class中的内容,参照 jvm官方文档 ,看下常量池中究竟是什么东西


常量池1-----0A 00 06 00 0F   //


 1,0A---tag为10,表示第一个常量类型为CONSTANT_Methodref,参照官方文档,CONSTANT_Methodref的结构为


CONSTANT_Methodref_info {
    u1 tag;
    u2 class_index;
    u2 name_and_type_index;
}


所以后面跟了4个字节

 2,00 06---声明当前方法类描述符索引值为6     //  java/lang/Object


 3,00 0F---当前方法的名称和类型索引值为15  //  "<init>":()V


所以,结合上文中反编译出的内容来看,这几个16进制翻译过来正好是


#1 = Methodref          #6.#15         //  java/lang/Object."<init>":()V


常量池2----09 00 10 00 11


 1,09---tag为9,类型为CONSTANT_Fieldref


 2,00 10---声明当前方法类描述符索引值为16 // java/lang/System


 3,00 11---字段描述符的名称和类型索引值为17 //  out:Ljava/io/PrintStream;


这几个16进制翻译过来正好是


#2 = Fieldref           #16.#17        //  java/lang/System.out:Ljava/io/PrintStream;


常量池3---08 00 12


  1,08---tag为8,类型为CONSTANT_String,根据官方文档,其结构为


CONSTANT_String_info {
    u1 tag;
    u2 string_index;
}


所以后面跟了两个字节

 

  2,00 12---声明当前String值所在的索引值为18

当前16进制翻译过来,表示


#3 = String             #18            //  test
相关文章
|
17小时前
|
安全 Java 调度
Java Queue深度解析:LinkedList为何成为队列的最佳实践?
【6月更文挑战第18天】Java的`LinkedList`适合作为队列,因其双向链表结构支持O(1)的头尾操作。非线程安全的`LinkedList`在单线程环境下效率高,多线程时可通过`Collections.synchronizedList`封装。此外,它还可兼做栈和双端队列,提供任务调度的高效解决方案。
|
18小时前
|
Java 程序员
Java多线程编程是指在一个进程中创建并运行多个线程,每个线程执行不同的任务,并行地工作,以达到提高效率的目的
【6月更文挑战第18天】Java多线程提升效率,通过synchronized关键字、Lock接口和原子变量实现同步互斥。synchronized控制共享资源访问,基于对象内置锁。Lock接口提供更灵活的锁管理,需手动解锁。原子变量类(如AtomicInteger)支持无锁的原子操作,减少性能影响。
15 3
|
19小时前
|
算法 Java
Java垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)的一种自动内存管理机制,用于在运行时自动回收不再使用的对象所占的内存空间
【6月更文挑战第18天】Java的GC自动回收内存,包括标记清除(产生碎片)、复制(效率低)、标记整理(兼顾连续性与效率)和分代收集(区分新生代和老年代,用不同算法优化)等策略。现代JVM通常采用分代收集,以平衡性能和内存利用率。
22 3
|
20小时前
|
存储 缓存 Java
滚雪球学Java(64):LinkedHashSet原理及实现解析
【6月更文挑战第18天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
9 1
滚雪球学Java(64):LinkedHashSet原理及实现解析
|
1天前
|
IDE Oracle Java
Java 是一种跨平台的编程语言,可以在各种操作系统上运行。
Java 是一种跨平台的编程语言,可以在各种操作系统上运行。
|
1天前
|
存储 JavaScript 前端开发
【JavaScript】JavaScript 中的 Class 类:全面解析
【JavaScript】JavaScript 中的 Class 类:全面解析
7 1
|
1天前
|
JavaScript 前端开发 Java
【JavaScript】ECMAS6(ES6)新特性概览(二):解构赋值、扩展与收集、class类全面解析
【JavaScript】ECMAS6(ES6)新特性概览(二):解构赋值、扩展与收集、class类全面解析
7 2
|
1天前
|
存储 算法 Java
Java Set深度解析:为何它能成为“无重复”的代名词?
【6月更文挑战第17天】Java Set实现无重复元素原理:HashSet利用哈希表(HashMap基础),通过hashCode()和equals()检查元素唯一性;TreeSet基于红黑树保持元素排序和唯一。选择合适的Set类(HashSet、TreeSet、LinkedHashSet)并正确实现对象的hashCode()和equals()是关键。示例代码展示了HashSet的去重功能。
|
1天前
|
Java
【Java】Object类简单解析
【Java】Object类简单解析
6 1
|
1天前
|
Java 开发者 C++
Java面向对象的终极挑战:抽象类与接口的深度解析!
【6月更文挑战第17天】在Java OOP中,抽象类和接口助力代码复用与扩展。抽象类不可实例化,提供通用框架,适合继承;接口包含纯抽象方法,支持多态与松耦合。选择抽象类用于继承已有方法和状态,接口则适用于不相关类共享行为。Java 8后接口能含默认方法,增加设计灵活性。抽象类与接口常结合使用,以实现最佳设计,如`Shape`抽象类实现`Drawable`和`Selectable`接口,展现两者协同优势。理解和熟练运用这对概念是提升代码质量的关键。

推荐镜像

更多