首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JVM之Class结构速记

access_flags访问标识 class继承实现关系 字段表 access_flags访问标识 名称索引描述符索引 存储额外信息 方法表 access_flags访问标识 名称索引描述符索引...无符号数就是正常数字,以u1,u2,u4,u8来表示一个,两个,四个,八个字节,通常用来描述数字,索引引用,数量值或者用来表达字符串。...当虚拟机做类加载时候,会常量池中拿出对应符号引用,在类创建或者运行时解析,翻译到具体内存地址之中 比如class文件类名,当类被加载到虚拟机中时,需要将这个符号引用转换为类真实所在内存地址才能被正常访问...) 图例: 接下来一个一个进行说明 access_flags访问标识 这个访问标识前面讲access_flags不一样,这个是字段访问标识 名称索引描述符索引 这两个索引都是在常量池中索引...access_flags访问标识 名称索引描述符索引 这两个索引都是在常量池中索引,对常量池引用 name_index为方法名称 descriptor_index为描述符,对应于方法来说是该方法参数集合返回类型

42910

详解JVM类文件结构

,因此常量池开头放置一个u2类型符号数,代表当前常量池容量.该1开始,若为5表示池中有4项常量,索引1~5 常量由二维表表示 开头有个常量池容量计数值,接下来就全是一个个常量了,只不过常量都是由一张张二维表构成...标志名称 标志 含义 ACC_INTERFACE 是一个接口,而不是一个类 ACC_MODULE 声明模块;可能无法其模块外部访问。仅当ClassFile具有Module属性时才可以设置。...它们按照顺序依次排列,类索引父类索引各自使用一个u2类型符号常量,这个常量指向CONSTANT_Class_info类型常量,该常量bytes字段记录了本类、父类全限定名....由于一个类接口可能有好多个,因此需要用一个集合来表示接口索引,它在类索引父类索引之后.这个集合头两个字节表示接口索引集合长度,接下来就是接口名字索引. 2.6 字段表集合 2.6.1 什么是字段表集合...在Java中,每个成员变量都有一系列修饰符,上述class文件访问标志作用一样,只不过成员变量访问标志与类访问标志稍有区别。 name_index 本字段名字索引

19610
您找到你想要的搜索结果了吗?
是的
没有找到

JVMclass文件结构详解

1开始,若为5表示池中有4项常量,索引1~5 常量由二维表表示 开头有个常量池容量计数值,接下来就全是一个个常量了,只不过常量都是由一张张二维表构成,除了记录常量以外,还记录当前常量相关信息...标志名称 标志 含义 ACC_INTERFACE 是一个接口,而不是一个类 ACC_MODULE 声明模块; 可能无法其模块外部访问。...它们按照顺序依次排列,类索引父类索引各自使用一个u2类型符号常量,这个常量指向CONSTANT_Class_info类型常量,该常量bytes字段记录了本类、父类全限定名....由于一个类接口可能有好多个,因此需要用一个集合来表示接口索引,它在类索引父类索引之后.这个集合头两个字节表示接口索引集合长度,接下来就是接口名字索引. 2.6 字段表集合 2.6.1 什么是字段表集合...在Java中,每个成员变量都有一系列修饰符,上述class文件访问标志作用一样,只不过成员变量访问标志与类访问标志稍有区别。 name_index 本字段名字索引

36230

统计师Python日记【第1天:谁来给我讲讲Python?】

熟悉 在正式介绍python之前,了解下面两个基本操作对后面的学习是有好处: (1)基本输入输出 可以在Python中使用+、-、*、/直接进行四则运算。...',9:'nine'} 这是一个“键—”映射结构,因此字典不能通过索引访问其中元素,而要根据键来访问其中元素: —————————————— >>>d={7:'seven',8:'eight'...10 —————————————— (2)分片 使用分片操作来访问一定范围内元素,它格式为: a[开始索引:结束索引:步长] 那么访问是,开始索引那个元素,到结束索引号-1那个元素,每间隔步长个元素访问一次...序列中列表位置第一个0开始,最后一个索引号可以用-1表示分片是干嘛?把序列分成一片一片也就是访问序列中一定范围内元素序列相加是干嘛?两个序列合并 乘法是干嘛?...a中某个字符元素n索引号b.find(n)>>> b.find('e') 1将列表中字符串用某符号穿起来符号.join(列表)>>>a=['h','e','l','l','o'] >>>'+'.join

1.3K71

Perl语言入门系列之一

数组或列表中每个元素都是单独标量变量,拥有独立标量值,这些都是有序,每个元素都有相应整数作为索引,此整数总是0开始递增。...⑴创建与访问数组 数组命名规则与标量变量类似,数组元素因赋值而诞生,我们在数组名称后面使用[]括起来索引进行赋值与访问,如下所示: $fred[0]="abc"; $fred[1]="cde";...,其中8个为undef 数组最后一个元素索引为$#fred,对于前面的数组这里$#fred=10,因此最后一个元素访问方法如下所示: $end = $fred[$#fred] 在Perl中还可以使用负索引数组末端开始索引...①poppush操作符 如果要新增元素到数组尾端,只需要将新数据存放到更高索引对应新位置即可,然而Perl在实际使用时很少使用索引来对数组进行操作。...'ney'} = 'rubble'; 与数组一样,哈希元素因赋值而诞生,对已存在哈希元素进行赋值,则会覆盖之前。如果使用哈希里不存在key进行索引,将会得到undef。

1.3K30

【建议收藏】Mysql知识干货(mysql八股文)汇总

问:mysql有哪些字段类型 类型 字节 最小 最大 tinint 1 有符号 -128;无符号 0 有符号 127;无符号 255 smallint 2 有符号 -2^16;无符号 0 有符号 2...datetime,不做任何改变,基本上是原样输入输出。 数据库三范式 第一范式(1NF)是指数据库表每一列都是不可分割基本数据线;也就是说:每列具有原子性,不可再分割。...,也就是说数据索引在一起 辅助索引:同样用B+Tree,data域存储相应记录主键而不是地址,首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。...一致性读也被称为快照读,当我们查询数据库在某个时间点快照时,只能看到这个时间点之前事务提交更新结果,而不能看到这个时间点之后事务提交更新结果。...mysql默认使用异步复制方式,这样节点不用一直访问主服务器来更新自己数据,数据更新可以在远程连接上进行,节点可以复制主数据库中所有数据库或者特定数据库,或者特定表。

68611

【进阶之路】深入理解Java虚拟机类加载机制(长文)

之前所说一致,数据被存储在方法区之后,会在Java堆内存中实例化一个代表这个类java.lang.Class对象,对象将作为方法区中这个类各种数据外部接口。...无符号数属于基本数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节8个字节符号数,无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串。...三、准备阶段 准备阶段是正式为类中定义变量(即静态变量)分配内存并设置类变量初始阶段,概念上来说,这些变量所使用内存都应当在方法区中进行分配。...3、如果上面的步骤正常执行,那么该符号引用已经在虚拟机中产生了一个直接引用,但是在解析完成之前需要对符号引用进行验证,主要是确认当前调用这个符号引用类是否具有访问权限,如果没有访问权限将抛出java.lang.IllegalAccess...在JDK9引入模块化之后,public类型也不在意味着程序任何位置都有它访问权限,还需要检查模块之间访问权限,接口方法访问完全有可能因为访问权限控制而出现java.lang.illegalAccessError

32710

Mysql基础命令02

如果是组合索引,则列组合必须唯一 主键索引:记录唯一,主键字段很少被改动,不能为空,不能修改,可用于一个字段或者多个字段 全文索引:检索文本信息, 针对较大数据,生成全文索引查询速度快,但也很浪费时间空间...(可以返回多个)(传出只能是变量) INOUT输入输出参数:既表示调用者向过程传入,又表示过程向调用者传出只能是变量) create procedure seebook(in b int)...语法:create trigger 触发器名称 触发器时机 触发器动作 on 表名 for each row 触发器名称:自定义 触发器时机:after/before 之后/之前 触发器动作:insert...myisam : 特性: 1、不支持事务,不支持外键,宕机时会破坏表 2、使用较小内存磁盘空间,访问速度快 3、基于表锁,表级锁 4、mysql 只缓存index索引, 数据由OS缓存 适用场景...memory类型访问非常快,因为它数据是放在内存中,并且默认使用HASH索引,但是一旦服务关闭,表中数据就会丢失掉。 ​

52820

Python基础汇总

#len(数据) 统计数据长度print(len(s)) #2:字符串取值:字符串名[索引] #索引0开始标记 # print(s[5]) # print(s[-1]) #字符串取多个:切片...print("加油把") else: print("你年龄输入有误,不能为负数") class_list.py #列表 list 符号[] 中括号 # a=[1,0.02,'...hello',[1,2,3],True] #1:可以存在空列表a=[] #2:列表里面可以包含任何类型数据 #3:列表里面的元素 根据逗号来进行分隔 #4:列表里面的元素,也是有索引索引...a=() # 2:元组里面可以包含任何类型数据 print(type(a)) # 3:元组里面的元素 根据逗号来进行分隔 # 4:元组里面的元素,也是有索引索引0 # 5:获取元组里面的单个...# s='hello' # L=[1,2,3] # d={"age":18,"name":'测试'}#字典类型数据 是遍历访问是key # for a in s:#for循环挨个遍历访问s里面的每一个元素

84910

详解Class类文件结构(上)

符号数属于基本数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节、8个字节符号数,无符号数可以来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串。...常量池容量由后2个字节指定,比如这里我是Ox001d,即十进制29,这就表示常量池中有29项常量,而常量池索引1开始,这一点需要特殊记忆,因为程序员习惯性计数法是0开始,而这里不一样...通过javap -v命令反编译出class文件之后,我们可以看到常量池内容 ? 常量池中主要存放两大类常量:字面量符号引用。...比如文本字符、声明为final常量值就属于字面量,而符号引用则包含下面三类常量: 类接口全限名 字段名称描述符 方法名称描述符 在之前文章(详谈类加载全过程)中有详细讲到,在加载类过程第二大阶段连接第三个阶段解析时候...索引CONSTANT_NameAndType_info索引项为615,那么反编译结果该项常量指向应该是#6#15,查看上面反编译图应证我们推测是对

2.2K41

Class文件结构全面解析(上)

符号数用u1、u2、u4、u8分别代表1个字节、2个字节、4个字节8个字节符号数,可以用来描述数字、索引引用、数量值或者UTF-8编码构成字符串。...再来看一下之前Class文件例子: 表示次版本号第5第6个字节为0x0000,表示主版本号第7第8个字节为0x0033,也就是十进制51,说明这个Class文件可以被JDK 1.7及其以上版本...再来看一下之前Class文件例子: 常量池容器计数值为0x0013,也就是十进制19,它表示常量池中有18个常量,索引范围1到18。...符号引用则是编译原理层次概念,它包括以下三种: 类接口全限定名 字段名称描述符 方法名称描述符 常量池中每一个常量都是一个表,共有14种不同常量类型(JDK1.7及之前版本),每一种类型表在第一位都有一个...访问标志 紧跟着常量池2个字节表示访问标志(access_flags),它用于识别一些类或接口层次访问信息,具体见下表: 标志名称 标志 含义 ACC_PUBLIC 0x0001 是否为public

28530

Java代码是如何被CPU狂飙起来

常量池表索引1开始,而不是0开始,这是因为常量池第0个位置是用于特殊用途访问标志 类或者接口访问标记,说明类是public还是abstract,用于描述该类访问级别属性。...访问标志取值范围是一个16位二进制数。 索引 包含了类索引、父类索引、接口索引数据,主要说明类继承关系。 字段表集合 主要是类级变量而不是方法内部局部变量。...方法表集合 主要用来描述类中有几个方法,每个方法具体信息,包含了方法访问标识、方法名称索引、方法描述符索引、属性计数器、属性表等信息,总之就是描述方法基础信息。...动态链接是通过在栈帧中维护一张方法调用符号表来实现。这张符号表中保存了当前方法中所有调用方法符号引用,包括方法名、参数类型返回类型等信息。...同时JVM会将方法返回压入调用方操作栈中以便于后续指令计算,操作完成之后虚拟机栈中奖栈帧进行弹出。 知道了虚拟机栈结构之后,我们来看下方法执行流转过程是怎样

36811

Python字符串使用详解

字符串是一种数据结构,这让我们有机会学习索引切片——用于字符串中提取子串方法。...我们输入一个字符串:’你好,Lucky’,Python使用方括号 [] 来对字符串进行索引,方括号内数字 0~n 表示将要获取字符串,如图1-1所示,sting[0~7]分别对应不同,最小字符换索引为...实际应用中,往往不会只用到正向索引(本文理解左向右),当你需要访问字符串最后一个字符时,也可以使用正向表达式,但字符串过长时明显不便,所以Python提供了一种方面的索引方式:右向左(负数索引)来表示...使用索引访问 s 中字符工作由 for 循环自动处理。...Windows 使 用 \r\n 表示行尾,OS X Linux 使用 \n, 而 OS X 之前 Mac 操作系统使用 \r。

83020

JavaScript学习

> 外联式 注意:除非特殊情况需要先执行js,一般我们都将js放在body中且在标签之前...,因为页面装载需要等待js下载与执行,这样操作可以在页面装载完成之后,再去下载执行js,既不会影响页面的正常加载,又可以提高效率!...(多少毫秒后执行一次) clearTimeout(timeoutID); //清除延迟执行 运算符优先级 优先级 运算符 说明 结合性 1 []、.、() 字段访问、数组索引、函数调用表达式分组...new typeof void 一元运算符、返回数据类型、对象创建、未定义 右向左 3 *、/、% 相乘、相除、求余数 左向右 4 +、- 相加、相减、字符串串联 左向右 5 >、>>...> 左位移、右位移、无符号右移 左向右 6 、>=、instanceof 小于、小于或等于、大于、大于或等于、是否为特定类实例 左向右 7 ==、!

7400

虚拟机类加载机制

在指定类中是否存在符合方法字段描述符以及简单名称所描述方法字段。 符号引用中类、字段方法访问性(private、protected、public、default)是否可被当前类访问。...、invokestatic、invokevirtual、multianewarray、new、putfieldputstatic这13个用于操作符引用字节码指令之前,先对它们使用符号引用进行解析。...3.类方法解析     类方法解析第一步字段解析一样,线解析出class_index项中索引方法所属类或接口符号引用,如果解析成功,用C表示这个类,虚拟机会按照点如下步骤进行后续类方法搜索:    ...1)类方法接口方法符号引用常量类型定义是分开,如果在类方法表中发现class_index中索引C是个接口,那就直接抛出java.lang.IncompatibleClassChangeError...静态语句块中只能访问到定义在静态语句块之前变量,定义在它之后变量,在前面的静态语句块中可以复制,但是不能访问

45710

HelloWorld 看 Java 字节码文件结构

Java类文件结构 Java 虚拟机规范中定义了许多规范,其中有一部分定义了字节码结构规范。Java 虚拟机规范定义了两种数据类型来表示 Class 文件格式,分别是:无符号表。...无符号数属于最基本数据类型,以 u1、u2、u4、u8 六七分别代表 1 个字节、2 个字节、4 个字节、8 个字节符号数,无符号数可以用来描述数字、索引引用、数量值或者按照 UTF-8 编码构成字符串...访问标志 在常量池结束之后,紧接着两个字节代表访问标记(access_flags),这个标志用于识别一些类或者接口层次访问信息,包括:这个Class是类还是接口、是否定义为public类型、是否定义为...这是因为这里访问标志可能是由多个标志名称组成,所以字节码文件中标志其实是多个进行或运算结果。 通过查阅上述表格,我们可以知道,00 21 由 00 01 00 20 进行或运算得来。...类索引、父类索引、接口索引索引父类索引都是一个u2类型数据,而接口索引集合是一组u2类型数据集合,Class文件中由这三项数据来确定这个类继承关系。 类索引

1.5K70

手把手教你 javap 反编译分解代码,授人以鱼不如授人以渔

Class文件结构 Class魔数版本 常量池 访问标志 类索引、父类索引与接口索引集合 字段表集合 字段访问标志 方法表集合 属性表集合 属性表之异常表 Class文件结构 我之前写了一篇关于class...方法部分符号引用 方法名称 方法描述符 访问标志 紧接着常量池之后两个字节代表访问标志(access_flags),用于识别一些类或者接口层次 访问信息,包括:这个Class是类还是接口、是否为...类索引、父类索引与接口索引集合 访问标志之后顺序排列类索引(this)、父类索引(super)、接口索引集合(interfaces)。Class文件由这三项来确定这个类集成关系。 ?...、类型及顺序)返回 字段访问标志 ?...方法表集合 懂了字段表之后,方法表结构几乎字段表结构是一模一样,通过访问标志、名称索引、描述符索引可清楚表达方法定义。

52250

JVM底层—Java Class字节码文件解析

符号数是用来描述数字、索引引用、数量值或者UTF-8编码字符串,可以称作是.class文件基本组成单位 表是由多个无符号数或其他表构成复合数据类型,整个.class文件本质就是一个表。...Java版本号是45开始,自jdk1.1之后每个jdk大版本发布主版本号都向上+1,并且高版本jdk能向下兼容以前版本.class文件。...上图中.class文件常量池计数是34,由于1开始,所以常量个数是33(十六进制22是十进制34)。也就是说,计数位之后33个表,都是表示常量。...(具体查看【查阅表格】) 总而言之,查看常量方法就是: 1.第一个字节为tag 查看常量池类型表找到对应类型 2.找到对应结构表,找到tag之后属于常量其他无符号访问标志 常量池结束后,紧接着两个字节表示访问标志...他们各自指向一个类型为CONSTANT_Class_info类描述符常量,通过CONSTANT_Class_info类型常量中索引可以找到定义在CONSTANT_Utf8_info类型常量中全限定名字符串

36320

JVM之类文件结构

- 无符号数 无符号数属于基本数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节8个字节符号数,无符号数可以用来描述数字、索引、数量值或者按照UTF-8编码构成字符串...紧接着魔数4个字节是Class文件版本号:第五第六个字节是次版本号,第七第八识主版本号,Java版本号是45开始。...11 对一个接口中声明方法符号引用 CONSTANT_NameAndType 12 对一个字段或方法部分符号引用 访问标志 在常量池结束之后紧接着两个字节代表访问标志,这个标志用于识别一些类或接口层次访问信息...类索引、父类索引、接口集合都按顺序排列在访问标志之后,类索引父类索引用两个u2类型索引表示,他们各自指向一个类型为CONSTANT_CLASS_info类描述符常量。...控制转移指令 控制转移之类可以让Java虚拟机有条件或无条件指定位置指令而不是控制转移之类下一条指令继续执行程序,概念模型上理解,可以认为控制转移指令就是在有条件或无条件地修改PC寄存器

42710

Swift进阶二:基本数据类型相关

进行强制展开之前必须确保可选项中包含一个非nil //let count = str!....count //print(count) // 6 //隐式展开 //⚠️有些可选项一旦被设定之后,就会一直拥有,此时就不必每次访问时候都进行展开 //通过在声明类型后面添加一个叹号来隐式展开可选项...is \(sum)"# // sum is \\(sum) let result3 = #"sum is \#(sum)"# // sum is 7 使用索引访问修改字符串 每一个String都有相关索引类型...我们可以使用index(before:)index(after:)方法来访问给定索引前后; 要访问给定索引更远索引,你可以使用index(_, offsetBy:); let name...Swift也就不能提供下标为数字随机访问。而且仅提供StartEnd2个默认String.index。这是因为它只能告诉你最开始最后, 因为其他都需要去从前或者后进行遍历。

81930
领券