深入理解Java虚拟机2:常量的本质含义与反编译及助记符详解

深入理解Java虚拟机2:常量的本质含义与反编译及助记符详解类加载现有如下代码 对于静态字段来说 只有直接定义了该字段的类才会被初始化 当一个类在初始化时 要求其父类全部都已经初始化完毕了 XX TraceClassLo 用于追踪类的加载信息并打印出来 publicclassM publicstatic String args System out

类加载

现有如下代码

/* * 对于静态字段来说,只有直接定义了该字段的类才会被初始化 * 当一个类在初始化时,要求其父类全部都已经初始化完毕了 * -XX:+TraceClassLoading,用于追踪类的加载信息并打印出来 */ public class MyTest{ 
    public static void main(String[] args) { 
    System.out.print("输出MyChild.str1\n"); System.out.println(MyChild.str1); } } class MyParent{ 
    public static String str1 = "hello world"; static { 
    System.out.println("MyParent static block"); } } class MyChild extends MyParent{ 
    public static String str2 = "welcome"; static { 
    System.out.println("MyChild static block"); } } 

JVM参数

所有的JVM参数都以 -XX: 开始,若后面为

  • +,表示开启option选项
  • -,表示关闭option选项
  • ,表示将option选项的值设置为value

常量

public class MyTest2 { 
    public static void main(String[] args) { 
    System.out.println(MyParent2.str); } } class MyParent2{ 
    public static final String str = "hello world"; static { 
    System.out.println("MyParent static block"); } } 

str前加上final关键字后

// 常量在编译阶段会被存到调用这个常量的方法的类的常量池中 public class MyTest2 { 
     public static void main(String[] args) { 
     System.out.println(MyParent2.str); } } class MyParent2{ 
     public static final String str = "hello world"; static { 
     System.out.println("MyParent static block"); } } 

重点

  • 常量会被存入到调用该常量的方法所在的类的常量池中
  • 本质上,调用类并没有直接引用到定义该常量的类,因此不会触发定义常量的类的初始化
  • 这里是将常量str存放到MyTest2的常量池中,之后MyTest2MyParent2就没有任何关系了
  • 甚至我们可以在运行一次后将MyParent2的class文件删除,而不会对结果产生任何影响

此时打开Terminal进入class文件所在的目录,使用javap -c MyTest2.class对class文件反编译的到下图
在这里插入图片描述
对比不加final关键字时的反编译信息
在这里插入图片描述
可见助记符ldc后面是一个String类型的字符串,而不再是MyParent2.str的变量








  • ldc :表示将int,float或是String类型的常量值从常量池中推送至栈顶

若使用如下代码:

public class MyTest2 { 
        public static void main(String[] args) { 
        System.out.println(MyParent2.s); } } class MyParent2{ 
        public static final short s = 7; static { 
        System.out.println("MyParent static block"); } } 
  • bipush :表示将单字节(-128 ~ 127)得常量值推送至栈顶

public class MyTest2 { 
         public static void main(String[] args) { 
         System.out.println(MyParent2.i); } } class MyParent2{ 
         public static final int i = 128; static { 
         System.out.println("MyParent static block"); } } 
  • sipush:表示将一个短整型常量值(-32768 ~ 32767)推送至栈顶

public class MyTest2 { 
          public static void main(String[] args) { 
          System.out.println(MyParent2.m); } } class MyParent2{ 
          public static final int m = 1; static { 
          System.out.println("MyParent static block"); } } 
  • iconst_1:表示将int类型1推送至栈顶(iconst_1 ~ iconst_5)

总结

常量

若使用 final 关键字,则得到常量。在编译阶段,常量会被存入到调用该常量的方法所在的类的常量池中,再次调用此常量时不一定会初始化定义其值的类,而是初始化调用该常量的方法所在的类。

助记符

  • ldc :表示将int,float或是String类型的常量值从常量池中推送至栈顶
  • bipush :表示将单字节(-128 ~ 127)得常量值推送至栈顶
  • sipush:表示将一个短整型常量值(-32768 ~ 32767)推送至栈顶
  • iconst_1:表示将int类型1推送至栈顶(iconst_1 ~ iconst_5)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177603.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午7:07
下一篇 2026年3月26日 下午7:07


相关推荐

  • CPU内核态和用户态的区别[通俗易懂]

    CPU内核态和用户态的区别[通俗易懂]内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序。用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取。指令划分特权指令:只能由操作系统使用、用户程序不能使用的指令。举例:启动I/O内存清零修改程序状态字设置时钟允许/禁止终端停机非特权指令:用户程序可以使用的指令。举例:控制转移算数运算取数指令访管指令(使用户程序从用户态陷入内核态)特权级别R0相当于.

    2025年12月14日
    4
  • pycharm2019激活成功教程版安装教程_2019最新版本的美篇下载

    pycharm2019激活成功教程版安装教程_2019最新版本的美篇下载安装2019Pycharm最新版本-详细教程–激活码1下载安装1.1打开官网http://www.jetbrains.com/pycharm/download/#section=windows1.2.双击下载好的exe,得到如下图所示,点击next1.3.软件安装在其他盘中,比如D盘1.4.根据自己电脑选择64位还是32位,选择关联.py,选择增加更新路径1.5.继续点…

    2022年8月29日
    6
  • VUE调试工具

    VUE调试工具3.VUE调试工具3.1调试工具安装到GitHub下载工具安装压缩包,解压到响应的文件夹。到解压的vue-devtools文件目录下安装依赖包。修改manifest.json文件,该文件在vue-devtools文件的\packages\shell-chrome下。把”persistent”:false改为”persistent”:true。”background”:{“scripts”:[“build/background.js”

    2025年8月11日
    4
  • 奔图打印机linux驱动rpm,奔图P2500打印机驱动

    奔图打印机linux驱动rpm,奔图P2500打印机驱动奔图 P2500 打印机驱动带给大家官方最新驱动程序 这款以黑色造型著称的易加粉黑白激光打印机性能客观 目前市场指导价为 1499 元 这里的驱动程序可以为大家解决一切问题 欢迎使用 奔图 P2500 打印机参数 型号 P2500 打印参数打印速度 22ppm A4 23ppm Letter 首页打印时间小于 7 8 秒最大月打印量 8 000 页建议月打印量 250 页到 2000 页分辨率 dpi 最大 1200 120

    2026年3月26日
    2
  • 快速批量去除图片水印方法大全~~

    原文地址:http://blog.163.com/simonyao_cool/blog/static/16512555720107311858809/

    2022年4月7日
    714
  • opencv高斯金字塔_高斯求和公式

    opencv高斯金字塔_高斯求和公式一、图像金字塔图像金字塔是一种以多分辨率来解释图像的结构,通过对原始图像进行多尺度像素采样的方式,生成N个不同分辨率的图像。把具有最高级别分辨率的图像放在底部,以金字塔形状排列,往上是一系列像素(尺寸)逐渐降低的图像,一直到金字塔的顶部只包含一个像素点的图像,这就构成了传统意义上的图像金字塔。获得图像金字塔一般包括二个步骤:1.利用低通滤波器平滑图像 2.对平

    2022年10月15日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号