热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

42.理解常量池(Class文件中的常量池与运行时常量池)

目录1.什么是常量池?2.为什么需要常量池?3.运行时常量池1.什么是常量池?1.字节码文件中有个constantpool,

目录

  • 1.什么是常量池?
  • 2.为什么需要常量池?
  • 3.运行时常量池


1.什么是常量池?

1.字节码文件中有个constant pool,就是常量池
2.当字节码文件被加载到内存中之后,方法区中会存放字节码文件的constant pool相关信息,这时候就成为了运行时常量池
在这里插入图片描述
3.常量池保存了各种字面量和对类型、域和方法的符号引用。
在这里插入图片描述
在这里插入图片描述
4.常量池可以看做是一张表,虚拟机指令根据这张表找到要执行的方法名、类名、参数类型、字面量等类型。

2.为什么需要常量池?

1.一个java源文件中的类、接口,编译后会产生一个字节码文件,而java中的字节码文件需要其他的数据支撑,通常这种数据很大,不能直接存放到字节码里面。所以把对这些数据的引用存放到常量池,在真正需要使用的时候,通过动态链接将符号引用转换为直接引用。
在这里插入图片描述
例子:

package jvm;import java.io.Serializable;public class MethodInnerStrucTest extends Object implements Comparable<String>,Serializable {//属性public int num &#61; 10;private static String str &#61; "测试方法的内部结构";//构造器//方法public void test1(){int count &#61; 20;System.out.println("count &#61; " &#43; count);}&#64;Overridepublic int compareTo(String o) {return 0;}
}

使用javap -v MethodInnerStrucTest反编译上面的java代码产生的class文件&#xff0c;得到下面的输出。
其中&#xff1a;Constant pool就是常量池。
常量池中存储的符号引用&#xff0c;在程序运行的时候&#xff0c;会被转换为直接引用。
例如&#xff1a;test1()方法的字节码 3: getstatic #30 // Field &#xff0c; #30就会引用到Constant pool里面的 #30 &#61; Fieldref #31.#33 // &#xff0c;程序运行的时候&#xff0c;就会直接进行转换。

Classfile /Users/simple/Documents/IBM/JVM/JVM/bin/jvm/MethodInnerStrucTest.classLast modified Jul 21, 2020; size 1250 bytesMD5 checksum 640842329ae45580b8fa6414cdc50a03Compiled from "MethodInnerStrucTest.java"
public class jvm.MethodInnerStrucTest extends java.lang.Object implements java.lang.Comparable.lang.String>, java.io.Serializableminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER
Constant pool:#1 &#61; Class #2 // jvm/MethodInnerStrucTest#2 &#61; Utf8 jvm/MethodInnerStrucTest#3 &#61; Class #4 // java/lang/Object#4 &#61; Utf8 java/lang/Object#5 &#61; Class #6 // java/lang/Comparable#6 &#61; Utf8 java/lang/Comparable#7 &#61; Class #8 // java/io/Serializable#8 &#61; Utf8 java/io/Serializable#9 &#61; Utf8 num#10 &#61; Utf8 I#11 &#61; Utf8 str#12 &#61; Utf8 Ljava/lang/String;#13 &#61; Utf8 ...
{public int num;descriptor: Iflags: ACC_PUBLIC...public void test1();descriptor: ()Vflags: ACC_PUBLICCode:stack&#61;4, locals&#61;2, args_size&#61;10: bipush 202: istore_13: getstatic #30 // Field java/lang/System.out:Ljava/io/PrintStream;6: new #36 // class java/lang/StringBuilder9: dup10: ldc #38 // String count &#61;12: invokespecial #40 // Method java/lang/StringBuilder."":(Ljava/lang/String;)V15: iload_116: invokevirtual #43 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;19: invokevirtual #47 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;22: invokevirtual #51 // Method java/io/PrintStream.println:(Ljava/lang/String;)V25: returnLineNumberTable:line 12: 0line 13: 3line 14: 25LocalVariableTable:Start Length Slot Name Signature0 26 0 this Ljvm/MethodInnerStrucTest;3 23 1 count I...
}

3.运行时常量池

掌握两点&#xff1a;
1.常量池指的是字节码文件中的Constant pool部分。这部分内容被类加载之后&#xff0c;存放到方法区的运行时常量池中。
2.运行时常量池具有动态性。也就是在方法区中的运行时常量池是可以发生变化的。而常量池就不行&#xff0c;它是静态的&#xff0c;当编译生成字节码文件直接就不变了。
在这里插入图片描述

更多JVM文章请访问我的JVM专栏&#xff1a;
https://blog.csdn.net/u011069294/category_10113093.html


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
author-avatar
lily的思念
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有