3

Java (実際には Dalvik) バイトコードを逆コンパイルしました。メソッドの開始時に、インスタンス メンバーのフィールドに直接 (つまり、getter を介さずに) アクセスします。

Object.getClass()アクセスされたインスタンス メンバー ( ) でJava 呼び出しが行われているようです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

アップデート:

メソッドの完全なソース コードを提供するようコメントで要求されました。は final フィールドであることに注意してください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; }
    }
}
4

2 に答える 2