首页 课程 师资 教程 报名

Java指令集:GETSTATIC

  • 2022-08-30 10:42:15
  • 1258次 动力节点

本文章向大家介绍JAVA指令集——GETSTATIC,主要包括JAVA指令集——GETSTATIC使用实例、应用技巧、基本知识点总结和需要注意事项。

(indexbyte1<<8)|indexbyte2——得到index

1.从runtimeconstantpool中取得index处的运行时常量A,A必须是指向字段的符号引用

FieldRef fieldRef = (FieldRef) runtimeConstantPool.getConstant(index);

2.A为指向字段B的符号引用,取得字段B的名字和描述符(要先取得字段B),以及字段B要所找的类或接口(也就是字段B所属的类或接口)

          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.字段B的值存储在字段所属的类(接口)中的staticVars中,索引为slotID.

我们要取出这个值,放到栈帧的操作数栈中

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吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交