更新時(shí)間:2022-08-30 10:42:15 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1261次
本文章向大家介紹JAVA指令集——GETSTATIC,主要包括JAVA指令集——GETSTATIC使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng)。
(indexbyte1<<8)|indexbyte2——得到index
1.從runtimeconstantpool中取得index處的運(yùn)行時(shí)常量A,A必須是指向字段的符號(hào)引用
FieldRef fieldRef = (FieldRef) runtimeConstantPool.getConstant(index);
2.A為指向字段B的符號(hào)引用,取得字段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是不是靜態(tài)字段,拋出IncompatibleClassChangeError()
if (!field.isStatic()) {
throw new IncompatibleClassChangeError();
}
5.字段B的值存儲(chǔ)在字段所屬的類(接口)中的staticVars中,索引為slotID.
我們要取出這個(gè)值,放到棧幀的操作數(shù)棧中
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:
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743