测试代码javacTestCode.javapublicclassTestCode{publicstaticvoidmain(String[]args){intaaaa=1;aaaa=2;}}反编译javap-v-p-lTestCode(l为小写L)注:javap是jdk自带的反解析工具。作用是根据类字节码文件,逆向分析当前类对应的代码区(汇编指令)、局部变量表、异常表、代码行偏移映射表、常量池等信息。类文件xxxxx/com/code/baseCode/TestCode.class最后修改时间2021-11-21;大小436字节MD5校验和c2864ab4f514372ff51ed92e384bb437从“TestCode.java”公共类com.code.baseCode.TestCode次要版本:0主要版本:52标志:ACC_PUBLIC、ACC_SUPER常量池:#1=Methodref#3.#19//java/lang/Object."":()V#2=Class#20//com/code/baseCode/TestCode#3=Class#21//java/lang/Object#4=Utf8#5=Utf8()V#6=Utf8Code#7=Utf8LineNumberTable#8=Utf8LocalVariableTable#9=Utf8this#10=Utf8Lcom/code/baseCode/TestCode;#11=Utf8main#12=Utf8([Ljava/lang/String;)V#13=Utf8args#14=Utf8[Ljava/lang/String;#15=Utf8aaaa#16=Utf8I#17=Utf8SourceFile#18=Utf8TestCode.java#19=NameAndType#4:#5//"":()V#20=Utf8com/code/baseCode/TestCode#21=Utf8java/lang/Object{publiccom.code.baseCode.TestCode();描述符:()Vflags:ACC_PUBLICCode:stack=1,locals=1,args_size=10:aload_01:invokespecial#1//Methodjava/lang/Object."":()V4:returnLineNumberTable:line8:0LocalVariableTable:StartLengthSlotNameSignature050thisLcom/code/baseCode/TestCode;publicstaticvoidmain(java.lang.String[]);描述符:([Ljava/lang/String;)V标志:ACC_PUBLIC,ACC_STATIC代码:stack=1,locals=2,args_size=10:iconst_11:istore_12:iconst_23:istore_14:返回行NumberTable:line11:0line12:2line52:4LocalVariableTable:StartLengthSlotNameSignature050args[Ljava/lang/String;231aaaaI}SourceFile:"TestCode.java"反编译后会发现aaaa存在于Constantpool(常量池)和LocalVariableTable(局部变量表)中。常量池说明JVM中有Class常量池、运行时常量池、全局字符串常量池和基本类型包装类常量池。类常量池:主要存放字面量和符号引用。详见https://vitzhou.top/20200821/字面量是固定值,inta=1,Stringa="abc",其中1和abc是字面量,但是java中的字面量必须是final的,因为地址每个类的内存地址在编译过程中是不知道的,因为这个类可能还没有被加载,所以如果你在一个类中引用了另一个类,那么你就没有办法知道它的内存地址,那怎么办,我们只能将他的类名作为符号引用,在类加载完成后,通过这个符号引用获取他的内存地址。运行时常量池:运行时常量池中的部分数据来自Class常量池,是动态的。字面量和符号引用存储在Class常量池中,符号引用在加载时会将Class中字节流表示的静态存储转换为方法区的运行时数据结构。不同的类使用相同的运行时常量池。字符串常量池:JVM维护的字符串实例的引用表。运行时常量池在方法区。JDK1.7之后,字符串常量池被移到了堆中。java中大部分基本类型的包装类都实现了常量池技术,这些类是Byte、Short、Integer、Long、Character、Boolean,另外两种浮点数类型的包装类都没有实现。另外,以上5个整型包装类只能在对应值小于等于127时才能使用对象池,即对象不负责创建和管理这些大于127的类的对象。以上JVM常量池介绍信息来自https://juejin.cn/post/685457...https://juejin.cn/post/699736...jvm中的class文件常量池存储了哪些信息?为什么常量池有变量名?https://blog.csdn.net/Hellowe...https://www.jianshu.com/p/cf7...局部变量表和操作数栈?https://www.jianshu.com/p/a6a...图片解释了java1.8编译后的内存布局。class文件结构:https://juejin.cn/post/688335...发生在运行时java字节码所在的情况下如何查看java字节码指令?https://en.wikipedia.org/wiki...http://githyuan.com/2015/10/24...上面的注释是变量1指的是LocalVariableTable中的第一个变量,也就是aaaa。iconst_1istore_1iconst_2istore_1end上面是基本数据类型的情况,后面是String类型,是封装类型的情况