更新时间:2022-08-30 10:42:15 来源:极悦 浏览944次
本文章向大家介绍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:
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习