Java Dynamic Proxy telah dijelaskan di API yang terhubung ke Java, jadi saya tidak akan menulisnya di sini. Apa yang saya mengerti:
Perluas fungsionalitas metode tertentu dalam antarmuka tertentu, dan ini adalah proxy. Proxy adalah metode panggilan melalui objek penangan panggilan yang terkait dengan instance proxy.
Mari kita lihat dengan contoh:
Antarmuka:
antarmuka publik num {void show (); int getnum (); int getProduct (int x);} Kelas Implementasi:
kelas publik mynum mengimplementasikan num {@override public int getNum () {return 3; } @Override public int getProduct (int x) {return x; } @Override public void show () {System.out.println ("Metode yang mendasarinya mencetak nomor 99"); }} Pertama -tama mari kita lihat bagaimana metode Invoke dijelaskan dalam API
Dengan kata lain, penangan panggilan memanggil metode yang mendasari yang mewakili objek metode ke objek kelas implementasi antarmuka.
Cara pertama untuk mengimplementasikan proxy:
kelas publik numproxy {num objek pribadi; // Bangun objek kelas implementasi antarmuka melalui metode konstruktor numproxy publik (objek num) {this.num = num; } Objek publik getNumbyProxy () {objek numProxy = proxy.newProxyInstance (num.getClass (). getClassLoader (), kelas baru yang dipahami. Parameter Metode Nyata*/ @Override Objek Publik Invoke (Proxy Object, Metode, Object [] Args) melempar Throwable {Object Obj = NULL; (Integer) OBJ * 2; return numproxy; }} Cara kedua untuk mengimplementasikan proxy: dengan mengimplementasikan antarmuka InvocationHandler
Kelas Publik NumProxyImpl mengimplementasikan InvocationHandler {// di sini saya telah membatasi jenis antarmuka, dan tidak ditulis sebagai objek pribadi num num; publik numProxyImpl (num num) {this.num = num; } @Override Public Object Invoke (objek proxy, metode metode, objek [] args) melempar lempar {objek obj = null; String methodName = method.getName (); if ("getProduct" .Equals (methodName)) {System.out.println ("Proxy: getProduct () start"); obj = method.invoke (num, args); obj = (integer) obj * 2; System.out.println ("Proxy: getProduct () end"); } else if ("show" .equals (methodName)) {system.out.println ("proxy: show () start"); obj = method.invoke (num, args); System.out.println ("Proxy: show () end"); } kembalikan obj; }} Kode Uji:
testnum kelas publik {public static void main (string [] args) {// test numproxy np = new numProxy (mynum baru ()); Num numProxy = (num) np.getnumbyproxy (); int x = numproxy.getProduct (2); System.out.println (x); numproxy.show (); System.out.println ("---------------------"); NumProxyImpl npi = nUrproxyImpl baru (mynum baru ()); Num numpro = (num) proxy.newproxyInstance (num.class.getClassLoader (), kelas baru [] {num.class}, npi); int n = numPro.getProduct (3); System.out.println (n); numpro.show (); }} Hasil konsol:
Metode kedua sedikit bingung. Saya tidak tahu apakah Anda memilikinya. Artinya, itu disebut metode Invoke di NumProxyImpl yang tidak ditampilkan, tetapi dieksekusi. Ya, mari kita turun untuk melihat ini.
Jika Anda tidak ingin merepotkan, ingat saja.
Misalnya, proses pengkodean dapat digunakan untuk menggunakan proxy, dan menulis contoh lain kali.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.