JAVA指令集——GETSTATIC

(indexbyte1<<8)|indexbyte2——得到index
1,从runtimeconstantpool中取得index处的FieldRef,FieldRef已经解析完成
FieldRef fieldRef = (FieldRef) runtimeConstantPool.getConstant(index);
2,获取FieldRef所知识的字段和字段所在的类
field = fieldRef.getResolvedFieldRef();
JClass targetClazz = field.getClazz();
3,检查字段B所属的类是否已被初始化,如果没有,就初始化
if (targetClazz.getInitState() == InitState.PREPARED) {
frame.setNextPC(frame.getNextPC() - 3);//opcode + operand = 3bytes
targetClazz.initClass(frame.getThread(), targetClazz);
return;
}
4,如果Field是不是静态字段,抛出IncompatibleClassChangeError()
if (!field.isStatic()) {
throw new IncompatibleClassChangeError();
}
5,getstatic的目的——取出字段的值,放入操作数栈中
静态字段——就是静态变量,静态字段的值就是静态变量的值
我们在加载——链接过程中,把除了非静态字段以外的全部信息都放在JClass对象上,然后把JClass对象添加到方法区中
其中静态字段——非final,把字段对应的默认值,放入JClass对象的 Vars staticVars中的staticVars[slotID]中;
final,从运行时常量池中取出字段的值,放入JClass对象的 Vars staticVars中的staticVars[slotID]中
所以我们现在要取出字段的值——从字段所属的JClass对象的staticVars中根据字段的ID取出字段的值
String descriptor = field.getDescriptor();
int slotID = field.getSlotID();
Vars staticVars = targetClazz.getStaticVars();
OperandStack stack = frame.getOperandStack();
switch (descriptor.charAt(0)) {
case 'Z':
case 'B':
case 'C':
case 'S':
case 'I':
stack.pushInt(staticVars.getInt(slotID));
break;
case 'F':
stack.pushFloat(staticVars.getFloat(slotID));
break;
case 'J':
stack.pushLong(staticVars.getLong(slotID));
break;
case 'D':
stack.pushDouble(staticVars.getDouble(slotID));
break;
case 'L':
case '[':
stack.pushObjectRef(staticVars.getObjectRef(slotID));
break;
default:
JAVA指令集——GETSTATIC的更多相关文章
- java指令集
0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 iconst_0 将int型0 ...
- Java二进制指令代码解析
http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html http://blog.csdn.net/sum_rain/article/ ...
- 深入理解Java:String
在讲解String之前,我们先了解一下Java的内存结构. 一.Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配. JVM主要管理两 ...
- Java里面instanceof怎么实现的
开始完全一头雾水呀,后面看了Java指令集的介绍,逐渐理解了. https://www.zhihu.com/question/21574535/answer/18998914 下面这个答案比较直白 你 ...
- java虚拟机学习-深入理解JVM(1)
1 Java技术与Java虚拟机 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言.Java类文件格式.Java虚拟机和Java应 ...
- Java虚拟机定义
虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机有自己完善的硬体架构,如处理器.堆栈.寄存器等,还具有相应的指令系统.JVM屏蔽了与具体操作系统平台相关的 ...
- 《java虚拟机》汇总所有关键要点
一 .java虚拟机底层结构详解 我们知道,一个JVM实例的行为不光是它自己的事,还涉及到它的子系统.存储区域.数据类型和指令这些部分,它们描述了JVM的一个抽象的内部体系结构,其目的不光规定实现J ...
- java——虚拟机、线程
java虚拟机: 是一台想象中的机器,有自己想象的硬件(处理器.堆栈.寄存器等)以及相应的指令系统. 生命周期:当执行java程序时,虚拟机开始运行,程序结束虚拟机停止.同一台计算机每多运行一个程序, ...
- Java -JVM:JVM百科
ylbtech-Java -JVM:JVM百科 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机 ...
随机推荐
- PHP is_dir() 函数
定义和用法 is_dir() 函数检查指定的文件是否是一个目录. 如果目录存在,该函数返回 TRUE. 语法 is_dir(file) 参数 描述 file 必需.规定要检查的文件. 提示和注释 注释 ...
- PHP pclose() 函数
定义和用法 pclose() 函数关闭由 popen() 打开的进程. 如果失败,该函数返回 FALSE. 语法 pclose(pipe) 参数 描述 pipe 必需.规定由 popen() 打开的进 ...
- PHP atan() 函数
实例 通过 atan() 函数返回不同数的反正切: <?phpecho(atan(0.50) . "<br>");echo(atan(-0.50) . " ...
- PHP floor() 函数
实例 向下舍入为最接近的整数: <?phpecho(floor(0.60) . "<br>");echo(floor(0.40) . "<br&g ...
- PHP localeconv() 函数
实例 查找美国本地的数字格式化信息: <?php setlocale(LC_ALL,"US"); $locale_info = localeconv(); print_r($ ...
- luogu P4284 [SHOI2014]概率充电器 期望 概率 树形dp
LINK:概率充电器 大概是一个比较水的题目 不过有一些坑点. 根据期望的线性性 可以直接计算每个元件的期望 累和即为答案. 考虑统计每一个元件的概率的话 那么对其有贡献就是儿子 父亲 以及自己. 自 ...
- 解决痛苦的方法/cy
这篇文章 源于我所有痛苦的回忆. 由于痛苦太多了 体会完了 所以 觉得这些都不算是什么大问题了 所以 这里 是解决痛苦的方法. 真的很痛苦的话 可以这样 对着全班人喊你们 都没我强 因为 你们都没有我 ...
- 解决Jenkins的html样式不生效问题的终极方案
本文从四个步骤来分享我们在自行搭建jenkins过程中遇到的报表样式不全(即html报告展示不正确)的问题: 1.问题现象 2.问题原因 3.问题原因补充 4.解决方法(可以直接跳到第四步解决问题) ...
- 华为手机内核代码的编译及刷入教程【通过魔改华为P9 Android Kernel 对抗反调试机制】
0x00 写在前面 攻防对立.程序调试与反调试之间的对抗是一个永恒的主题.在安卓逆向工程实践中,通过修改和编译安卓内核源码来对抗反调试是一种常见的方法.但网上关于此类的资料比较少,且都是基于AOSP ...
- 实用!一键生成数据库文档,堪称数据库界的Swagger
本文收录在个人博客:www.chengxy-nds.top,技术资料共享,同进步 最近部门订单业务调整,收拢其他业务线的下单入口,做个统一大订单平台.需要梳理各业务线的数据表,但每个业务线库都有近百张 ...