Deskripsi singkat
Saya selalu khawatir tentang kurangnya mekanisme delegasi siap pakai Java. Untungnya, saya punya waktu baru -baru ini, dan menulis modul delegasi sederhana dengan refleksi untuk referensi.
API Modul
Delegater kelas publik () // Konstruksi parameter kosong, kelas ini mengelola instance delegasi dan mengimplementasikan metode delegasi // Tambahkan Delegasi Metode Statis, dan Mengembalikan ID Nilai Integer untuk mewakili instance yang terdiri dari metode dan parameter. Jika gagal, kembalikan -1. Publik yang disinkronkan int addFunctionDelegate (kelas <?> Srcclass, String MethodName, Object ... params); // Tambahkan Delegasi Metode Instal, kembalikan ID Nilai Integer untuk mewakili instance yang terdiri dari metode dan parameter. Jika gagal, kembalikan -1. public synchronized int addFunctionDelegate(Object srcObj,String methodName,Object... params);//Delete a method delegate from the delegate instance based on the integer ID and return whether it is successful public synchronized Boolean removeMethod(int registerID);//Execute all method delegates in this delegate instance in sequence (unordered) public synchronized void InvokeallMethod (); // Konversi tabel parameter ke parameter tipe tabel kelas privat <?> [] getParamTypes (objek [] params); // Dapatkan metode instance metode pribadi dari kelas yang ditentukan, nama metode, dan parameter tabel tabel private getDstMethod (class <? Srcclass, string MethodName, class <? params) // kelas delegatenode menjelaskan delegasi metode statis saat tidak menggunakan konstruksi objek, termasuk instance metode dan tabel parameter. Kelas delegatenode (objek srcobj, metode refmethod, objek [] params) // kelas delegatenode menjelaskan delegasi metode instance saat menggunakan konstruksi objek, termasuk instance kelas, instance metode dan tabel parameter void public InvokeMethod (); // Metode delegasi yang menjalankan deskripsi node adalah deskripsi node public void (); // Metode delegasi yang mengeksekusi deskripsi node adalah deskripsi node public void (); //
Kode Sumber
import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Hashtable;/**Delegater class uses RTTI and reflection to implement the delegate mechanism in Java* @author Three-way brick* */public class Delegater {static int register = Integer.MIN_VALUE;//ID allocation variable Hashtable<Integer,DelegateNode> nodeTable;//Manage ID and the container of the corresponding delegate public Delegater() {nodeTable = new Hashtable<Integer,DelegateNode>();}//Add static method delegate public synchronized int addFunctionDelegate(Class<?> srcClass,String methodName,Object... params) {Class<?>[] paramTypes = getParamTypes(params);Method refMethod;if((refMethod = getDstMethod(srcClass,methodName,paramTypes)) != null) {register++;nodeTable.put(register,new DelegateNode(refMethod, params));return register;} else {return -1;}} // Tambahkan metode dinamis delegasi publik disinkronkan int addFunctionDelegate (objek srcoBj, string methodName, objek ... params) {class <?> [] paramtypes = getParamTypes (params); metode refmethod; if (if (refmethod = getDstypes (params); metode refmethod; if ((refmethod = getDstypes (smethod); Metode RefMethod; if ((refmethod = getDstypes (smethod); Metode RefMethod; if ((refmethod = getMethod (params); ! = null) {register ++; nodetable.put (register, delegatenode baru (srcoBj, refmethod, params)); return register;} else {return -1;}} // hapus metode delegasi public boolean (intregering) {if (if nodetable) {ifeTable) {ifeet. true;} return false;} // Jalankan metode delegasi yang tidak tertata void void invokeallmethod () {for (node delegatenode: nodetable.values ()) {node.invokeMethod ();} // Konversi tabel parameter ke tabel parameter tipe parameter <) () [] [] [ {Class <?> [] ParamTypes = kelas baru <?> [Params.length]; for (int i = 0; i <params.length; i ++) {paramTypes [i] = params [i] .getClass ();} parameter paramety;} // Dapatkan contoh metode berdasarkan contoh kelas kelas, dan paramet metode; MethodName, kelas <?> [] ParamTypes) {Metode result = null; coba {result = srcclass.getMethod (MethodName, paramtypes); if (result.getReturnType ()! = void.class) {System.out.println ("Peringatan, Metode:"+MethodName) {System.out.println ("Peringatan, Metode:"+MethodName+"memiliki nilai AKTREONM+"; SecurityException e) {System.out.println ("Tidak dapat menemukan metode:"+methodName+", pastikan itu ada dan terlihat!");} Hasilnya;}} kelas delegatenode {objek srcobj; metode refethod; objek [] params; delegatenode publik (metode referensi referensi [] paramethm; this.params = params;} delegatenode publik (objek srcobj, metode refmethod, objek [] params) {this.srcobj = srcobj; this.refmethod = refmethod; this.params = params;} public void InvokeMethod () {try {refmethod.invoke (srcoBj, params);} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {System.out.println ("Method:"+++PRMEph E) {System.out.println ("" METODE: "+) {System.out.println (" Method: "" gagal!");}}}Pengujian modul
DelegaterTest kelas publik {public void showInfo () {System.out.println ("Hello Delegate!");} public void showcustominfo (Info string) {System.out.println (info);} public static void showstaticInfo () {System.out.println ("static void showstaticInfo () {System.out.println (" static void publicTaticInfo () {System.out.println ("static public void showStaticInfo () {System.out.println showcustomstaticInfo (info string) {System.out.println (info);} public static void main (string [] args) {delegater dele = delegater baru (); delegaterTest tester = new delegaterTest (); Int id = = dele.addfunctionDelegate (tester, "showinfo"); dele.addfunctionDelegate (tester, "showcustominfo", "custom!"); dele.addfunctionDelegate (delegaterTest.class, "showstaticinfo"); dele.addfuncti onDelegate(DelegaterTest.class,"showCustomStaticInfo","StaticCustom!");dele.invokeAllMethod();dele.removeMethod(ID);System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Hasil Eksekusi:
Staticcustom!
StaticDelegate!
Kebiasaan!
Hellodelegate!
------------------
Staticcustom!
StaticDelegate!
Kebiasaan!
Hal -hal lain
Beberapa metode publik menggunakan disinkronkan untuk memastikan keamanan utas variabel register sehingga mereka tidak akan membuat kesalahan karena beberapa utas.
Peringatan akan dikeluarkan untuk delegasi dengan nilai pengembalian, tetapi modul masih menerima delegasi tersebut, tetapi Anda tidak akan mendapatkan nilai pengembalian saat menjalankan delegasi.
Nilai maksimum dari delegasi yang ditambahkan adalah proses toleransi kesalahan setelah integer.max_value-integer.min_value tidak dipertimbangkan (umumnya tidak ada begitu banyak fungsi yang memerlukan delegasi.
Eksekusi yang didelegasikan tidak teratur, dan ketika persyaratan kinerja diperlukan, cobalah untuk tidak memblokir fungsi yang didelegasikan, jika tidak itu akan mempengaruhi pelaksanaan fungsi yang didelegasikan lainnya.
Pertanyaan lain dapat diposting untuk didiskusikan.
Meringkaskan
Di atas adalah semua penjelasan terperinci dari artikel ini tentang menerapkan kode mekanisme delegasi di Java melalui refleksi. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait Java lainnya di situs web ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!