(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. C++ 第二天 字符串

    字符串 字符串是最常用的一种数据类型了,在python中声明字符串和声明其他类型的数据一样,都非常的简单.但是在c++中,对于字符串的操作,相对来说要稍微复杂一些. C++ 提供了以下两种类型的字符串 ...

  2. 如何使用PHP验证客户端提交的表单数据

    PHP 表单验证 本章节我们将介绍如何使用PHP验证客户端提交的表单数据. PHP 表单验证 在处理PHP表单时我们需要考虑安全性. 本章节我们将展示PHP表单数据安全处理,为了防止黑客及垃圾信息我们 ...

  3. Ubuntu chmod 命令修改文件chmod读写权限

    Ubuntu chmod 命令可以用来修改文件或文件夹的读写权限 chmod 命令有两种使用方式 一. chmod [u/g/o/a] [+/-/=] [r/w/x] filename [ ]里都代表 ...

  4. react-ts模板/脚手架

    react-ts-template 脚手架 使用 npm i -g maple-react-cli maple-react-cli init 选择模板 'react-ts-template' 输入自定 ...

  5. Redis 超详细总结笔记总

    作者 | 王爷科技 来源 | www.toutiao.com/i6713520017595433485 1. Redis 简介 Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key ...

  6. SparkBench安装使用入门

    SparkBench安装以及快速开始 欢迎关注我的GitHub~ 本指南假定已经可以正常使用Spark 2.x,并且可以访问安装它的系统. 系统环境 CentOS 7.7.1908 Ambari-Sp ...

  7. TF签名为什么这么稳定?TF签名找微导流!

      TF签名作为目前最稳定的签名方式收到了业界开发者们的认可,而在如今鱼龙混杂的签名平台中,应该如何选择客厅的TF签名平台呢?下面就一起来看看TF签名为什么这么稳定?TF签名找微导流!   TF签名的 ...

  8. ios企业签名为什么会掉签?

      我们都知道ios用户无法直接安装App Store之外的应用,对于那些无法上架苹果应用商店的APP,开发者们一般会选择苹果签名的形式.   目前的苹果签名有ios企业签名.超级签名和TF上架这三种 ...

  9. Dropzone.js文件拖拽上传提示Dropzone already attached 解决

    最近收到客户的反馈,在操作上传文件有时会出现没有任何.大部分时间是正常. 重现问题后,f12打开后台控制台发现如下提示: Uncaught Error: Dropzone already attach ...

  10. Xcode11更改启动页设置方法

    新开了个项目,发现之前的启动页怎么也调不好,后来发现配置里边少了一行,所以整理一下,我使用的xcode版本是11. 以前的时候是在这2个中间,还有一行,通过下边2项来配置,现在更改了,附上新的教程.如 ...