(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的更多相关文章

  1. java指令集

    0x00 nop      什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1   将int型-1推送至栈顶 0x03 iconst_0   将int型0 ...

  2. Java二进制指令代码解析

    http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html http://blog.csdn.net/sum_rain/article/ ...

  3. 深入理解Java:String

    在讲解String之前,我们先了解一下Java的内存结构. 一.Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配. JVM主要管理两 ...

  4. Java里面instanceof怎么实现的

    开始完全一头雾水呀,后面看了Java指令集的介绍,逐渐理解了. https://www.zhihu.com/question/21574535/answer/18998914 下面这个答案比较直白 你 ...

  5. java虚拟机学习-深入理解JVM(1)

    1   Java技术与Java虚拟机 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言.Java类文件格式.Java虚拟机和Java应 ...

  6. Java虚拟机定义

    虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机有自己完善的硬体架构,如处理器.堆栈.寄存器等,还具有相应的指令系统.JVM屏蔽了与具体操作系统平台相关的 ...

  7. 《java虚拟机》汇总所有关键要点

    一  .java虚拟机底层结构详解 我们知道,一个JVM实例的行为不光是它自己的事,还涉及到它的子系统.存储区域.数据类型和指令这些部分,它们描述了JVM的一个抽象的内部体系结构,其目的不光规定实现J ...

  8. java——虚拟机、线程

    java虚拟机: 是一台想象中的机器,有自己想象的硬件(处理器.堆栈.寄存器等)以及相应的指令系统. 生命周期:当执行java程序时,虚拟机开始运行,程序结束虚拟机停止.同一台计算机每多运行一个程序, ...

  9. Java -JVM:JVM百科

    ylbtech-Java -JVM:JVM百科 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机 ...

随机推荐

  1. PHP 标量类型与返回值类型声明

    标量类型声明 默认情况下,所有的PHP文件都处于弱类型校验模式. PHP 7 增加了标量类型声明的特性,标量类型声明有两种模式: 强制模式 (默认) 严格模式 标量类型声明语法格式: declare( ...

  2. CF321E Ciel and Gondolas Wqs二分 四边形不等式优化dp 决策单调性

    LINK:CF321E Ciel and Gondolas 很少遇到这么有意思的题目了.虽然很套路.. 容易想到dp \(f_{i,j}\)表示前i段分了j段的最小值 转移需要维护一个\(cost(i ...

  3. 看了这篇文章,我搞懂了StringTable

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 String应该是Java ...

  4. PHP代码混淆与加密——php screw plus

    php是一个开源的.广受欢迎的语言,php应用常常是以代码明文的发式发布,但是有时候对于发布的代码我们想要进行保护,需要对php代码进行混淆与加密,让增加破解者的逆向难度,从而达到保护自己成果的目的. ...

  5. Spring Validation最佳实践及其实现原理,参数校验没那么简单!

    之前也写过一篇关于Spring Validation使用的文章,不过自我感觉还是浮于表面,本次打算彻底搞懂Spring Validation.本文会详细介绍Spring Validation各种场景下 ...

  6. grid网格布局使用

    定义 grid布局是指对网页进行划分成一个一个网格,然后根据自己的要求,可以任意组合. 以前写类似的功能,很麻烦,需要写很多的CSS去控制,有了grid就很方便了,可以随意进行组合. 跟flex有很多 ...

  7. Mybatis 的连接池技术

    我们在前面的 WEB 课程中也学习过类似的连接池技术,而在 Mybatis 中也有连接池技术,但是它采用的是自 己的连接池技术.在 Mybatis 的 SqlMapConfig.xml 配置文件中,通 ...

  8. 使用Android Studio创建模拟器,安装配置Android SDK

    Android Studio 一个写安卓APP应用的代码编辑器之类的?嗯,应该是... 这里只是需要用到里面的AVD Manager 创建安卓模拟器(也可以用mumu类的安卓模拟器):SDK Mana ...

  9. Java助教工作总结

    很荣幸在步入在研究生之际,有机会能协助代老师完成面向对象程序设计(java)课程的教学工作.这也是我人生中第一次接触助教工作,好多东西不太清楚,也没经验,有什么做的不好的,还望老师同学及时指出. 上周 ...

  10. LInux下Posix的传统线程示例

    简介 Linux线程是需要连接pthreat库,线程的使用比进程更灵活,需要注意的是线程间的互斥,或者说是资源共享问题. C++11之后,C++标准库也引入了线程,并且使用非常方便,以后再介绍,这里先 ...