Skip to content

۳. خواندن و تغییر آرایه‌ها (خروجی متد) ​

وقتی متدی را هوک می‌کنید که خروجی آن آرایه است (یا آرایه‌ای را به عنوان ورودی می‌گیرد)، آن آرایه در فریدا به عنوان یک Java Array Handle شناخته می‌شود. خوشبختانه این هندل شباهت زیادی به آرایه‌های JS دارد و می‌توانید:

  1. طول آن را با .length بگیرید.
  2. با اندیس [i] به عناصر دسترسی داشته باشید.
  3. عناصر آن را تغییر دهید.

سناریو: دستکاری لیست کاربران (آرایه برگشتی) ​

کد جاوا:

java
package com.example.app

public class UserManager {
    /* متدی که لیست کاربران را برمی‌گرداند */   
    public String[] getUserList() {
        return new String[] {"Admin", "Guest", "Tester"}
    }
}

کد فریدا (حلقه زدن و تغییر مقادیر):

javascript
Java.perform(function () {
    var UserManager = Java.use("com.example.app.UserManager")

    UserManager.getUserList.implementation = function () {
        /* دریافت آرایه اصلی از متد */        
        var userArray = this.getUserList()

        console.log("[+] Original List Length: " + userArray.length)

        /* حلقه زدن روی آرایه */        
        for (var i = 0 i < userArray.length i++) {
            console.log("    User [" + i + "]: " + userArray[i])
            
            /* دستکاری مقدار یکی از خانه‌ها */           
            if (userArray[i] === "Guest") {
                userArray[i] = "SuperUser" /* ارتقاء سطح دسترسی! */ 
                console.log("    >>> Changed 'Guest' to 'SuperUser'")
            }
        }

        /* بازگرداندن آرایه دستکاری شده به برنامه */        
        return userArray
    }
})

نکته مهم در لاگ کردن

اگر خود شیء آرایه را مستقیما console.log کنید، ممکن است فقط هندل مموری یا عبارت [object Object] را ببینید. برای دیدن محتوای آرایه‌های بایتی می‌توانید از JSON.stringify(array) استفاده کنید، اما برای آرایه‌های شی‌ء (Object Arrays) بهتر است روی آن‌ها حلقه بزنید.

لیست تایپ‌های رایج در Java.array ​

تایپ جاوارشته ورودی در فریدامثال
byte[]'byte'Java.array('byte', [0x00, 0x01])
int[]'int'Java.array('int', [10, 20])
boolean[]'boolean'Java.array('boolean', [true, false])
String[]'java.lang.String'Java.array('java.lang.String', ["A", "B"])
MyClass[]'com.pkg.MyClass'Java.array('com.pkg.MyClass', [obj1, obj2])