[JVM] - 不就是JVM么 JVM的继续探究
前面几章跟着作者的脚步实现了使用Go语言查看java的.class文件源码(16进制)
复习一下:
相比Java语言,Go的访问控制非常简单,只有公开和私有两种. 所有首字母大写的类型,
结构体,字段,变量,函数,方法等都是公开的. 可供其它包使用. 首字母小写则是私有的.
只能在包内部使用.
接下来使用大神作者的classpy查看某个class文件,当然也能打开.jar

这是被称呼为魔数的代码.
很多文件格式都会规定满足该格式的文件必须以某几个固定字节开头,这几个字节主要起到标识作用, 叫做魔数( magic number )
class文件的魔术是"0xCAFEBABE"
除了Object.class, 看到OutOfMemoryError.class同样也有这个魔数
classfile/class_file.go :
func (self *ClassFile) readAndCheckMagic(reader *ClassReader) {
magic := reader.readUint32()
if magic != 0xCAFEBABE {
panic("java.lang.ClassFormatError: magic!")
}
}
通过if 判断是否为 0xCAFEBABE 继而做出响应,JAVA虚拟机规范规定,如果加载class文件不符合要求的格式,Java虚拟机实现就抛出java.lang.ClassFormatError异常
再一个是版本号.

为了还要节省时间看缓存知识,这里大概略过一下
这个是类访问标志, 作者说由于常量池比较复杂放到3.3节介绍了
常量池之后就是这个类访问标志,这是一个16位的"bitmask(位掩码)" , 指出class文件定义的是类还是接口,访问级别是public还是private,等等.
类和超类索引, 类访问标志之后是两个u2类型的常量池索引,分别给出类名和超类名.
class文件存储的类名类似完全限定名, 但是把点换成了斜线, Java语言规范把这种名叫 二进制名 (binary names)
因为每个类都有名字,所以thisClass必须是有效的常量池索引.
除java.lang.Object之外,
其他类都有超类, 所以superClass只在Object.class中是0 , 在其它class文件中必须是有效的常量池索引.
<非Object.class
那么!
接口索引表
,类和超类索引后面是接口索引表,表中存放的也是常量池索引.
给出该类实现的所有接口的名字.
拿Object.class的来看,剩下的还有这些

字段啊,方法啊,参数啊.等等吧! 忽然想起来一句话,不管之前的过往和经历如何,都是为了你能更好地成长! 所以要把失败当动力,把压力当动力!
和类一样,字段和方法也有自己的访问标志. 访问标志之后是一个常量池索引,给出字段名或方法名.
然后又是一个常量池索引,给出字段或方法的描述符,最后是属性表.
等等.
3.3节 解析常量池 (为了加快看SpringBoot底层知识,我也是加快了打字速度)
常量池呢 它占据了class文件很大一部分数据, 里面存放着各式各样的常量信息, 包括:
数字, 字符串常量池, 类, 接口名, 字段, 方法名, 等等.
JVM还要深入,但现在要看SpringBoot的深入知识点了
PS D:\go\workspace\bin> ch03 -Xjre "F:\jre7" java.lang.String
java.lang.String
version: 51.0
constants count:
access flags: 0x31
this class: java/lang/String
super class: java/lang/Object
interfaces: [java/io/Serializable java/lang/Comparable java/lang/CharSequence]
fields count:
value
hash
serialVersionUID
serialPersistentFields
CASE_INSENSITIVE_ORDER
HASHING_SEED
hash32
methods count:
<init>
<init>
<init>
<init>
<init>
<init>
<init>
checkBounds
<init>
<init>
<init>
<init>
<init>
<init>
<init>
<init>
<init>
<init>
length
isEmpty
charAt
codePointAt
codePointBefore
codePointCount
offsetByCodePoints
getChars
getChars
getBytes
getBytes
getBytes
getBytes
equals
contentEquals
contentEquals
equalsIgnoreCase
compareTo
compareToIgnoreCase
regionMatches
regionMatches
startsWith
startsWith
endsWith
hashCode
indexOf
indexOf
indexOfSupplementary
lastIndexOf
lastIndexOf
lastIndexOfSupplementary
indexOf
indexOf
indexOf
lastIndexOf
lastIndexOf
lastIndexOf
substring
substring
subSequence
concat
replace
matches
contains
replaceFirst
replaceAll
replace
split
split
toLowerCase
toLowerCase
toUpperCase
toUpperCase
trim
toString
toCharArray
format
format
valueOf
valueOf
valueOf
copyValueOf
copyValueOf
valueOf
valueOf
valueOf
valueOf
valueOf
valueOf
intern
hash32
compareTo
<clinit>
[JVM] - 不就是JVM么 JVM的继续探究的更多相关文章
- JVM参数(一)JVM类型以及编译器模式
现在的JVM运行Java程序(和其它的兼容性语言)时在高效性和稳定性方面做的非常出色.自适应内存管理.垃圾收集.及时编译.动态类加载.锁优化——这里仅仅列举了某些场景下会发生的神奇的事情,但他们几乎不 ...
- JVM基础:深入学习JVM堆与JVM栈
转自:http://developer.51cto.com/art/201009/227812.htm JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题, ...
- 概览JVM的基本结构和JVM内存结构
概览JVM的基本结构和JVM的内存结构 这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫 ...
- JVM(8):JVM知识点总览-高级Java工程师面试必备
http://www.importnew.com/23792.html jvm 总体梳理 jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 GC分析 命令调优 当然这些知识点 ...
- JVM的基本结构和JVM的内存结构
这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫JVM内存模型. 1.JVM的基本结构 ...
- JVM(七),JVM面试小知识
七.JVM面试小知识 1.JVM三大性能调优参数 -Xms -Xmx -Xss 的含义 2.java内存模型中堆和栈的区别 3.不同JDK版本中的intern()方法的区别
- jvm学习(2)JVM内存说明
前言 一.类方法 类方法是静态方法,前面需要有static修饰符修饰.类方法内不能涉及有关变量的内容1.不能调用类的对象方法2.不能引用对象变量3.类方法不能被重写(覆盖)4.类方法不能使用super ...
- JVM探秘:jinfo查看JVM运行时参数
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 如何查看JVM运行时参数,对于线上JVM调优是很关键的,因为只有知道了当前使用的JVM ...
- JVM性能优化 (一) 初识JVM
一.我们为什么要对JVM做优化 在本地开发环境中我们很少会遇到需要对JVM进行优化的需求,但是到了生产环境,我们可能会有下面的需求: 运行的应用"卡住了",日志不输出,程序没有反应 ...
- JVM源码分析之JVM启动流程
原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 “365篇原创计划”第十四篇. 今天呢!灯塔君跟大家讲: JVM源码分析之JVM启动流程 前言: 执行Java类的main方法,程序就能运 ...
随机推荐
- 怎样在wordpress后台显示日志 ID
有时我们需要在wordpress后台编辑特定的文章,找了大半天眼睛都花了,不禁会吐槽一下.有没有什么办法可以直接在日志列表查看日志 ID 呢?我们可以通过下面的代码实现: <?php /* Pl ...
- (c++) int 转 string,char*,const char*和string的相互转换
一.int 和string的相互转换 1 int 转化为 string c++ //char *itoa( int value, char *string,int radix); // 原型说明: / ...
- PHPExcel使用-使用PHPExcel导入文件
导入步骤: 1. 实例化excel读取对象 2. 加载excel文件 ----------------> ( 1>. 全部加载. 2>. 选择加载. ) 3. 读取excel文件 - ...
- POJ3096:Surprising Strings(map)
http://poj.org/problem?id=3096 for循环真是奇妙! #include <string.h> #include <stdio.h> #includ ...
- http协议基础(二)请求和响应报文的构成
http协议用于客户端和服务器之间的通信,请求访问资源的一方称为客户端,而提供资源响应的一方称为服务器端. 下面就是客户端和服务端之间简单的通信过程 PS:请求必须从客户端建立通信,服务端没收到请求之 ...
- C# 多线程,new ThreadStart(方法)中的方法如果有参数,该怎么写
using System; using System.Threading; public class Work { public static void Main() { // Start a thr ...
- sql server 视图的操作
-- 判断要创建的视图名是否存在if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[视图名]') and OBJ ...
- VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)
鸡啄米在上一节教程中讲了工具栏资源及CToolBar类,本节继续讲解工具栏的相关知识,主要内容包括工具栏的创建.停靠与使用. 工具栏的使用 上一节中鸡啄米提到过,一般情况下工具栏中的按钮在菜单栏中都有 ...
- Python: 没有switch-case语句
初学Python语言,竟然很久才发现Python没有switch-case语句 官方的解释说,“用if... elif... elif... else序列很容易来实现 switch / case 语句 ...
- linux常用命令:用SecureCRT来上传和下载文件
用SSH管理linux服务器时经常需要远程与本地之间交互文件.而直接用SecureCRT自带的上传下载功能无疑是最方便的,SecureCRT下的文件传输协议有ASCII.Xmodem.Zmodem. ...