۱. سناریو: پیادهسازی اینترفیس (Handling Callbacks)
در اندروید، بسیاری از عملیاتها (مثل کلیک دکمه یا دریافت پاسخ سرور) به صورت غیرهمگام (Async) و با استفاده از Interfaceها انجام میشود. اگر بخواهیم نتیجه یک عملیات را بگیریم، باید کلاسی بسازیم که آن اینترفیس را داشته باشد.
فرض کنید یک متد داریم که یک "شنونده" (Listener) میگیرد تا نتیجه دانلود را به آن اعلام کند.
کد جاوا (تعریف اینترفیس و متد):
java
package com.example.network
/* 1. تعریف اینترفیس */
public interface DownloadListener {
void onResult(String data)
}
/* 2. کلاسی که از این اینترفیس استفاده میکند */
public class Downloader {
public void startDownload(DownloadListener listener) {
/* ... دانلود انجام میشود ... */
listener.onResult("Secret Data Downloaded!")
}
}ما نمیتوانیم Java.use را روی اینترفیس بزنیم. باید یک کلاس جدید بسازیم که متد onResult را داشته باشد و آن را به اپلیکیشن پاس بدهیم.
کد فریدا (ساخت کلاس و ارسال آن):
javascript
Java.perform(function () {
var Downloader = Java.use("com.example.network.Downloader")
var DownloadListener = Java.use("com.example.network.DownloadListener")
/* ساخت یک کلاس جدید که اینترفیس DownloadListener را پیادهسازی میکند */
var MyListener = Java.registerClass({
name: 'com.hack.MyListener',
implements: [DownloadListener],
methods: {
onResult: function (data) {
console.log("[+] Intercepted Result: " + data)
}
}
})
/* استفاده از کلاس جدید */
var downloaderInstance = Downloader.$new()
var myListenerInstance = MyListener.$new()
console.log("[*] Starting download with our fake listener...")
downloaderInstance.startDownload(myListenerInstance)
})