【发布时间】:2012-10-29 04:20:32
【问题描述】:
我反编译了 Java(实际上是 Dalvik)字节码。在方法的开头,我直接访问实例成员的字段(即不通过 getter)。
似乎 Java 在访问的实例成员 (mOther) 上调用了 Object.getClass(),但没有在任何地方使用结果。这是某种检查吗?为什么需要这个调用?我怀疑这是因为我直接访问了一个字段(在该类中定义),但我没有看到连接。
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
更新:
在 cmets 中要求我提供该方法的完整源代码。请注意,mOther 是 final 字段(出于性能原因)。你在这里:
@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; }
}
}
【问题讨论】:
-
你能提供你正在反编译的函数的完整源代码,包括它的声明吗?我认为您忽略了一些对您的问题很重要的细节。
-
@danfuzz ha。你打败了我:)
-
Hrm,还不清楚(抱歉)。你能也包含函数的其余反编译吗?更好的是,也许你可以减少函数(例如,去掉循环,甚至可能去掉一个 if 语句),然后反编译 that。可能还有你感兴趣的好奇心。
-
请注意,它是 Dalvik VM,而不是 JVM。我正在为 Android 2.2(及更高版本)开发。我正在为 DEX 文件使用流行的 baksmali 反汇编程序。今天,我将尝试迭代地缩减函数,并检查它如何更改反编译的字节码(以及 getClass() 是否仍然存在)。
-
@ThomasCalc 是的,我知道这是 Dalvik。 (注:我设计了 Dalvik。)
标签: java android bytecode dalvik