سؤال

مقدمة

أحاول التعرف على تعليمات DalvikVM باستخدام مجمع/مفكك Smali/Baksmali لملفات dex.

مشكلة

من ملف جافا هذا

package gd;

class Hello {
    public static void main(String[] args)
    {
      System.out.println("Hello!");
    }
}

لقد قمت بإنشاء ملف التجميع smali التالي:

.class Lgd/Hello;
.super Ljava/lang/Object;
.source "Hello.java"


# direct methods
.method constructor <init>()V
    .registers 1

    .prologue
    .line 3
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    return-void
.end method

.method public static main([Ljava/lang/String;)V
    .registers 3
    .parameter

    .prologue
    .line 6
    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

    const-string v1, "Hello!"

    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

    .line 7
    return-void
.end method

سؤالي هو حول السطر التالي.

sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

كما أفهم أن هذا يقوم بتحميل الكائن الثابت PrintStream التابع java.lang.System فئة في v0 يسجل.الآن، ماذا يفعل هذا out: يقصد؟

هل كانت مفيدة؟

المحلول

PrintStream هو في الواقع نوع الشيء الذي يتم تحميله.قد تتم الإشارة إلى الكائن الذي تقوم بتحميله باسم java.lang.System.out, ، أين java.lang هي الحزمة، System هو الفصل، و out هو العضو (حقل ثابت) الذي سيتم تحميله.

يمكنك رؤية نفس النمط في الاستدعاء الظاهري: java.io هي الحزمة، PrintStream هو الطبقة و println هو العضو (في هذه الحالة، طريقة المثيل).وفي كلتا الحالتين، يسبق العضو ب ->.لا أعرف ما إذا كان هذا النمط ثابتًا في جميع أنحاء سمالي.

وجدت http://source.android.com/tech/dalvik/dalvik-bytecode.html لا تقدر بثمن عندما كنت ألعب بأشياء dalvik، على الرغم من أن مساهمتها في هذه الحالة كانت مجرد تحديد أن كائن sget يتطلب وسيطتين فقط.أخبرني ذلك ->out: يجب أن يكون العمل جزءًا من مرجع الحقل الثابت.

نصائح أخرى

في الواقع يقرأ الحقل الثابت المسمى out الطبقة java.Lang.System. The (expected) type of that field isjava.io.PrintStream`.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top