JVM之Class文件解析

这里使用的工具是notepad++,没有的可以参考之前的博客:https://blog.csdn.net/qq_43222167/article/details/106326330
类加载过程:https://editor.csdn.net/md/?articleId=106287297
通过16进制打开后的文件如下
JVM之Class文件解析_第1张图片
u:字节,一个格子代表一个字节

u4:前四个字节,即

JVM之Class文件解析_第2张图片
一个字节代表什么呢,比如说ca是一个字节,fe也是一个字节。它们四个加一起叫魔术,作用是用来识别Class文件格式,值为:0xCAFEBABE

JVM之Class文件解析_第3张图片

u2:这个是次版本号(minor_version)

JVM之Class文件解析_第4张图片

u2:主版本号(major_version)

jdk的特性:高版本编译,低版本不能运行,低版本编译,高版本可以运行(向下兼容)

例如我这里先改成35
在这里插入图片描述
运行结果:

"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" -Dvisualvm.id=927448388516300 "-javaagent:D:\install\develop\javaIde\idea\IntelliJ IDEA 2019.2.1\lib\idea_rt.jar=64804:D:\install\develop\javaIde\idea\IntelliJ IDEA 2019.2.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;D:\Project\Idea\JVM\out\production\JVM" myclass.Test
java.lang.UnsupportedClassVersionError: myclass/Test has been compiled by a more recent version of the Java Runtime (class file version 53.0), this version of the Java Runtime only recognizes class file versions up to 52.0
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" 
Process finished with exit code 1

接下来重新修改
在这里插入图片描述

运行结果
JVM之Class文件解析_第5张图片

在这里插入图片描述

u2:常量池容量计数(constant_pool_count)

转成10进制后减1
例:22转成10进制后得到34,减1为33

下面我们去IDE工具里面去验证一下
命令为javap -v class文件名。可以得到常量池
JVM之Class文件解析_第6张图片
最后结果为33
JVM之Class文件解析_第7张图片

class文件中只有两种数据类型:无符号数和表

无符号数
JVM之Class文件解析_第8张图片
像这里面的ca fe ba be 呀,00,34什么的,都是无符号数

解析常量
JVM之Class文件解析_第9张图片
从我们的a列开始,也就是第一行的0a,打开计算器得到它十六进制转成十进制后的结果为10

参与我们的表找到值为10的位置
JVM之Class文件解析_第10张图片
u1代表一个字节,u2代表两个字节,也就是
在这里插入图片描述

可以看到值为10的那有两个u2,所以分别再次通过计算器得到的值为
JVM之Class文件解析_第11张图片
JVM之Class文件解析_第12张图片
所以第一个常量的值就得出来了
在这里插入图片描述
再解析第二个
在这里插入图片描述
转成十进制后值为9
JVM之Class文件解析_第13张图片
表中对应为9的值
JVM之Class文件解析_第14张图片
也是两个两个字节,取class文件中后面的值分别转换成10进制为
在这里插入图片描述
JVM之Class文件解析_第15张图片
JVM之Class文件解析_第16张图片
所以第二个常量的值也出来了
JVM之Class文件解析_第17张图片
再带着做一个
在这里插入图片描述
转十进制
JVM之Class文件解析_第18张图片
表中对应的值
在这里插入图片描述
这里显示u2只有一个,也就是两个字节的只有一个,对应的class文件
在这里插入图片描述
转十进制后
JVM之Class文件解析_第19张图片
对应的值为
JVM之Class文件解析_第20张图片
然后继续挨个自己转,达到会转即可,不需要全部转出来
我这里翻译了这么五个
JVM之Class文件解析_第21张图片
在java中使用javap -v命令查看
JVM之Class文件解析_第22张图片
是可以对应得上的

你可能感兴趣的:(JVM)