我反编译的Java(实际上的Dalvik)字节码。 在方法的开始,我直接访问一个实例成员的一个字段(即,不通过的吸气剂)。
看来THA Java调用Object.getClass()
在访问实例成员( mOther
),但并没有在任何地方使用的结果。 这是某种形式的检查? 这是为什么呢呼叫所需? 我怀疑这是因为我直接访问场(这是在类中定义的),但我没有看到连接。
在Java代码和反编译的字节码如下。
(请注意,最后一条指令的负载lifeTime
为常数0x0001
,因为在MyOtherClass
,我有lifeTime
的public final
场,目前从代码初始化)。
MyOtherClass other = mOther;
if (mAge >= other.lifeTime) { // lifeTime is initialized to 0x0001
end();
return;
}
.line 53
move-object/from16 v0, p0
iget-object v0, v0, Lcom/example/engine/MyClass1;->mOther:Lcom/example/engine/MyOtherClass;
move-object/from16 v16, v0
.line 54
.local v16, other:Lcom/example/engine/MyOtherClass;
move-object/from16 v0, p0
iget v0, v0, Lcom/example/engine/MyClass1;->mAge:I
move/from16 v18, v0
// Why is Object->getClass() called?
invoke-virtual/range {v16 .. v16}, Ljava/lang/Object;->getClass()Ljava/lang/Class;
const/16 v19, 0x0001
更新:
它要求在我提供的方法的完整的源代码注释。 需要注意的是mOther
是最后一个字段(由于性能原因)。 在这里,您是:
@Override
public void doStep() {
MyOtherClass other = mOther;
if (mAge >= other.lifeTime) {
end();
return;
}
mAge += TICK_TIME;
boolean isSurrounded = false;
if (mAge > mLastSurroundTime + other.surroundingTime) {
int distance = (int)other.maxSurroundDistance;
for (int bx = bx0; bx <= bx1; ++bx) {
if (bx < 0 || bx >= mSize) { continue; }
for (int by = by0; by <= by1; ++by) {
if (by < 0 || by >= mSize) { continue; }
ArrayList<WorldObject> candidates = getCandidatesAtPos(bx, by);
for (int i = 0; i < candidates.size(); ++i) {
WorldObject obj = candidates.get(i);
if (mSelf!= obj && mSelf.getDistanceFrom(obj) <= other.maxSurroundDistance) {
obj.notifyDangerImminent(mSelf);
isSurrounded = true;
}
}
}
}
if (isSurrounded) { mLastSurroundTime = mAge; }
}
}