Pertama-tama analisis tiga peran dalam model proksi dinamis:
1. Peran abstrak: Dalam proxy statis, dapat berupa kelas abstrak, tetapi dalam proxy dinamis, hanya dapat berupa antarmuka.
2. Peran nyata: Ini hanya mengimplementasikan metode dalam peran abstrak.
3. Peran agen: Yang paling menjijikkan adalah peran agen dalam agen dinamis. Itu harus mengacu pada karakter sebenarnya.
Ini melibatkan antarmuka dan kelas, antarmuka InvocationHandler dan kelas Proxy. Menurut dokumentasi JDK, antarmuka InvocationHandler diimplementasikan oleh sebuah kelas, dan turunan dari kelas ini adalah objek handler yang sesuai dengan objek proxy. Ketika suatu metode dari objek proxy dipanggil, metode tersebut akan dikodekan dan ditugaskan ke metode pemanggilan dari objek pengendali yang sesuai untuk dipanggil!
Copy kode kodenya sebagai berikut:
//Peran abstrak:
antarmuka publik Peran Abstrak
{
pertunjukan kekosongan publik();
}
//Karakter asli:
kelas publik RealRole mengimplementasikan AbstrakRole
{
@Mengesampingkan
public void show(){ System.out.println("tunjukkan rumahmu");
}
//Peran agen:
//Saya pikir ini hanya agen palsu. Saya sendiri yang membuat agen palsu = =! , karena sebenarnya itu adalah penangan yang berhubungan dengan agen
Handler kelas publik mengimplementasikan InvocationHandler
{
private Object realRole; // Peran proxy harus memiliki referensi ke peran sebenarnya. Jika didefinisikan sebagai tipe Objek, itu bersifat universal.
Handler publik (Objek realRole)
{ this.peran nyata = peran nyata; }
@Mengesampingkan
pemanggilan Objek publik (Proksi objek, Metode metode, Objek[] args)
{
System.out.println("Berikan uangmu"); // Ini adalah fungsi tambahan yang ditambahkan oleh peran agen itu sendiri.
method.invoke(this.realRole, args); //Panggil metode peran sebenarnya melalui refleksi
System.out.println("Oke...rumah milikmu");//Ini adalah fungsi tambahan yang ditambahkan oleh peran agen itu sendiri.
}
public Object factory()//Hasilkan peran agen nyata melalui metode pabrik
{
return Proxy.newProxyInstance(this.getClass().getClassLoader(), this.realObject.getClass().getInterfaces(), this); //Metode newProxyInstance di Proxy memiliki dua karakteristik yang sangat penting! Yang pertama adalah membuat kelas proxy secara dinamis, jika outputnya berupa kelas bernama $Proxy0; yang kedua adalah membuat instance melalui kelas yang dibuat secara dinamis.
}
}
//Klien:
Tes kelas publik
{
public static void main(String[] args)
{
RealRole realRole = new RealRole();//Peran nyata mana yang ingin Anda wakili, cukup buat peran nyata baru
Handler handler = new Handler(realRole);//Handler yang sesuai dengan kelas proxy dibuat di sini.
Proksi abstractRole = (AbstractRole)handler.factory();//Hasilkan objek proksi melalui metode pabrik
}
}
Anda mungkin bertanya-tanya bagaimana peran agen di sini dapat diubah secara paksa menjadi peran abstrak? Alasannya terletak pada metode newProxyInstance. Metode ini terlalu menarik. Seperti disebutkan di atas, metode ini secara otomatis akan menghasilkan kelas dan kemudian menghasilkan objek proxy melalui kelas tersebut. Faktanya, kelas ini mengimplementasikan kelas peran abstrak. Karena parameter kedua sudah menentukan antarmuka mana yang diimplementasikannya. Jadi Anda bisa memaksa transfer. Setelah transfer paksa, Anda bisa memanggil metode dalam peran abstrak.
proxy.show();//Oke! Perhatikan kalimat ini. Saya menandainya dengan warna merah di awal, "Metode ini akan dikodekan dan ditugaskan ke metode pemanggilan objek handler yang sesuai untuk dipanggil!" Tentu saja, parameter metode show juga diikuti, tetapi metode show di sini tidak memiliki parameter. Jadi kalimatnya proxy.show() sebenarnya memanggil metode invoke di objek handler.