Skip to content

۱. سناریو: بازگرداندن اشیاء Generic ​

فرض کنید یک متد داریم که تنظیمات را برمی‌گرداند، اما خروجی آن به صورت Object تعریف شده است (چون ممکن است عدد، متن یا هر چیزی باشد).

کد جاوا (تعریف متد):

java
package com.example.utils

public class Storage {
    /* این متد Object برمی‌گرداند، ولی ما می‌دانیم گاهی String است */    
    public Object getValue(String key) {
        if (key.equals("username")) {
            /* این در اصل یک String است */        
            return "admin_user" 
        }
        /* این یک Integer است */        
        return 123 
    }
}

اگر در فریدا سعی کنیم مستقیما متد length() (که مال String است) را روی خروجی صدا بزنیم، خطا می‌گیریم چون کلاس Object متد length ندارد. باید آن را Cast کنیم.

کد فریدا (استفاده از Cast):

javascript
Java.perform(function () {
    var Storage = Java.use("com.example.utils.Storage")
    /* کلاسی که می‌خواهیم به آن تبدیل کنیم */    
    var StringClass = Java.use("java.lang.String")

    Storage.getValue.implementation = function (key) {
        /* 1. دریافت خروجی اصلی (که نوعش در اینجا Object است) */        
        var resultObj = this.getValue(key)

        if (key === "username") {
            /* 2. تبدیل Object به String برای دسترسی به متدهای String */            
            /* اگر Cast نکنیم، متد .length() وجود ندارد */            
            var stringInstance = Java.cast(resultObj, StringClass)
            
            console.log("[+] Casted Value: " + stringInstance)
            console.log("[+] Length: " + stringInstance.length()) 
        }
        
        return resultObj
    }
})