۱. سناریو: بازگرداندن اشیاء 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
}
})