亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

通過反射實現Java下的委托機制代碼詳解

2024-07-13 10:15:09
字體:
來源:轉載
供稿:網友

簡述

一直對Java沒有現成的java/221867.html">javascript/131548.html">委托機制耿耿于懷,所幸最近有點時間,用反射寫了一個簡單的委托模塊,以供參考。

模塊API

public Class Delegater()//空參構造,該類管理委托實例并實現委托方法 //添加一個靜態方法委托,返回整型值ID代表該方法與參數構成的實例。若失敗,則返回-1。 public synchronized int addFunctionDelegate(Class<?> srcClass,String methodName,Object... params);//添加一個實例方法委托,返回整型值ID代表該方法與參數構成的實例。若失敗,則返回-1。 public synchronized int addFunctionDelegate(Object srcObj,String methodName,Object... params);//根據整型ID從委托實例中刪除一個方法委托,返回是否成功 public synchronized Boolean removeMethod(int registerID);//依次執行該委托實例中的所有方法委托(無序) public synchronized void invokeAllMethod();//將參數表轉換為參數類型表 private Class<?>[] getParamTypes(Object[] params);//由指定的Class、方法名、參數類型表獲得方法實例 private Method getDstMethod(Class<?> srcClass,String methodName,Class<?>[] paramTypes);class DelegateNode(Method refMethod,Object[] params)//DelegateNode類在不使用Object構造時敘述了一個靜態方法委托,包括方法實例及參數表 class DelegateNode(Object srcObj,Method refMethod,Object[] params)//DelegateNode類在使用Object構造時敘述了一個實例方法委托,包括類實例、方法實例及參數表 public void invokeMethod();//執行該節點敘述的方法委托

源代碼

import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Hashtable;/**Delegater類使用RTTI及反射實現Java下的委托機制  * @author 三向板磚  * */public class Delegater {	static int register = Integer.MIN_VALUE;	//ID分配變量 	Hashtable<Integer,DelegateNode> nodeTable;	//管理ID與對應委托的容器 	public Delegater() 	  {		nodeTable = new Hashtable<Integer,DelegateNode>();	}	//添加靜態方法委托 	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;		}	}	//添加動態方法委托 	public synchronized int addFunctionDelegate(Object srcObj,String methodName,Object... params) 	  {		Class<?>[] paramTypes = getParamTypes(params);		Method refMethod;		if((refMethod = getDstMethod(srcObj.getClass(),methodName,paramTypes)) != null) 		    {			register++;			nodeTable.put(register,new DelegateNode(srcObj,refMethod, params));			return register;		} else 		    {			return -1;		}	}	//刪除一個方法委托 	public synchronized Boolean removeMethod(int registerID) 	  {		if(nodeTable.containsKey(registerID)) 		    {			nodeTable.remove(registerID);			return true;		}		return false;	}	//無序地執行委托方法 	public synchronized void invokeAllMethod() 	  {		for (DelegateNode node:nodeTable.values()) 		    {			node.invokeMethod();		}	}	//將參數表轉化為參數類型表 	private Class<?>[] getParamTypes(Object[] params) 	  {		Class<?>[] paramTypes = new Class<?>[params.length];		for (int i = 0;i < params.length;i++) 		    {			paramTypes[i] = params[i].getClass();		}		return paramTypes;	}	//根據Class類實例、方法名、參數類型表獲得一個Method實例 	private Method getDstMethod(Class<?> srcClass,String methodName,Class<?>[] paramTypes) 	  {		Method result = null;		try {			result = srcClass.getMethod(methodName, paramTypes);			if(result.getReturnType() != void.class) 			      {				System.out.println("Warning,Method:"+methodName+" has a return value!");			}		}		catch (NoSuchMethodException | SecurityException e) {			System.out.println("Can Not Found Method:"+methodName+",ensure it's exist and visible!");		}		return result;	}}class DelegateNode {	Object srcObj;	Method refMethod;	Object[] params;	public DelegateNode(Method refMethod,Object[] params) 	  {		this.refMethod = refMethod;		this.params = params;	}	public DelegateNode(Object srcObj,Method refMethod,Object[] 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:"+refMethod.toString()+" invoke fail!");		}	}}

模塊測試

public class DelegaterTest {	public void showInfo() 	  {		System.out.println("Hello Delegate!");	}	public void showCustomInfo(String info) 	  {		System.out.println(info);	}	public static void showStaticInfo() 	  {		System.out.println("Static Delegate!");	}	public static void showCustomStaticInfo(String info) 	  {		System.out.println(info);	}	public static void main(String[] args) {		Delegater dele = new Delegater();		DelegaterTest tester = new DelegaterTest();		int ID = dele.addFunctionDelegate(tester,"showInfo");		dele.addFunctionDelegate(tester,"showCustomInfo","Custom!");		dele.addFunctionDelegate(DelegaterTest.class,"showStaticInfo");		dele.addFunctionDelegate(DelegaterTest.class,"showCustomStaticInfo","StaticCustom!");		dele.invokeAllMethod();		dele.removeMethod(ID);		System.out.println("------------------");		dele.invokeAllMethod();	}}

執行結果:

StaticCustom!

StaticDelegate!

Custom!

HelloDelegate!

------------------

StaticCustom!

StaticDelegate!

Custom!

其他事項

一些public方法使用synchronized是為了保證register變量的線程安全,使其不會因為多線程而出錯。

對于有返回值的委托,會報出警告,但模塊還是接受這樣的委托的,不過在執行委托時您將不能得到返回值。

添加的委托最大值是Integer.MAX_VALUE-Integer.MIN_VALUE超出后的容錯處理沒有考慮(一般也沒這么多函數需要委托的吧。

委托執行是無序的,而且,需要性能要求時,委托的函數盡量不要有阻塞過程,否則會影響其他委托函數的執行。

還有什么問題可以發上來一同探討。

總結

以上就是本文關于通過反射實現Java下的委托機制代碼詳解的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他Java相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲午夜激情免费视频| 欧美区在线播放| 久久伊人精品一区二区三区| 国产精品久久久久久久久免费看| 成人免费在线视频网站| 久久成人国产精品| 日韩精品在线观| 一本大道香蕉久在线播放29| 中文字幕欧美精品在线| 国产精品麻豆va在线播放| 日韩国产欧美精品一区二区三区| 亚洲欧美综合v| 国产精品久久色| 国产性猛交xxxx免费看久久| 欧美激情一区二区三区在线视频观看| 日本精品视频在线观看| 国产美女主播一区| 九九九久久国产免费| 永久555www成人免费| 97视频在线观看免费高清完整版在线观看| 日韩在线精品视频| 国产精品永久免费观看| 亚洲奶大毛多的老太婆| 亚州av一区二区| 欧美一级大片在线免费观看| 操91在线视频| 亚洲国产精品成人精品| 琪琪亚洲精品午夜在线| 日韩精品免费在线视频观看| 欧美中在线观看| 亚洲视频999| 美乳少妇欧美精品| 国产精品高潮呻吟久久av无限| 久久亚洲精品一区二区| 亚洲最大福利视频网| 亚洲天堂影视av| 日韩在线不卡视频| 国产精品一区二区3区| 黑人巨大精品欧美一区二区三区| 92版电视剧仙鹤神针在线观看| 97视频在线观看亚洲| 5278欧美一区二区三区| 久久99视频免费| 欧美日韩不卡合集视频| www.日本久久久久com.| 日韩在线视频免费观看高清中文| 日韩h在线观看| 欧美黑人一级爽快片淫片高清| 日韩小视频在线| 欧美性xxxxx极品| 日韩综合中文字幕| 91chinesevideo永久地址| 黄色成人av网| 国产精品久久久久久五月尺| 热久久美女精品天天吊色| 久久精品视频va| 色综合色综合网色综合| 国产精品视频内| 国产成人在线一区| 97国产真实伦对白精彩视频8| 久久综合亚洲社区| 日韩精品中文字幕在线| 蜜臀久久99精品久久久久久宅男| 黑人精品xxx一区一二区| 国产精品成人在线| 色天天综合狠狠色| 亚洲激情久久久| 伊人伊成久久人综合网站| 国产精品男女猛烈高潮激情| 成人黄色片在线| 欧美日韩国产一中文字不卡| 欧美劲爆第一页| 国产精品美女在线观看| 色诱女教师一区二区三区| 精品视频一区在线视频| 日韩一区视频在线| 91精品国产91久久久久久| 亚洲国产成人av在线| 成人免费淫片视频软件| 午夜精品理论片| 78m国产成人精品视频| 成人黄色在线免费| 国产成+人+综合+亚洲欧美丁香花| 国产主播精品在线| 亚洲国产精品va| 国产在线观看精品| 57pao成人永久免费视频| 亚洲欧美综合区自拍另类| 国产成人精品视频| 久久精品电影网站| 国产亚洲一区精品| 欧美视频在线看| 国产美女扒开尿口久久久| 欧美性xxxxx极品娇小| 欧美小视频在线观看| 日韩视频免费在线| 69久久夜色精品国产69乱青草| 日本成人精品在线| 成人激情视频网| 亚洲欧美国产另类| 成人字幕网zmw| 亚洲国产成人在线视频| 色噜噜狠狠狠综合曰曰曰| 欧美中文字幕在线视频| 亚洲精品www久久久久久广东| 亚洲一级黄色片| 97超碰色婷婷| 日韩成人在线网站| 欧美成人剧情片在线观看| 日韩欧美精品在线观看| 国产亚洲欧美日韩美女| 亚洲aa中文字幕| 一区二区三区亚洲| 最近免费中文字幕视频2019| 国产日产久久高清欧美一区| 亚洲国产精品中文| 亚洲视频第一页| 久久久精品欧美| 97国产精品人人爽人人做| 日韩在线免费高清视频| 久久久久久久久久国产精品| 午夜伦理精品一区| 精品成人在线视频| 亚洲精品一区二三区不卡| 国产精品69精品一区二区三区| 亚洲三级免费看| 日韩成人在线播放| 日韩av电影在线免费播放| 亚洲激情久久久| 精品一区二区三区四区| 亚洲跨种族黑人xxx| 亚洲人成网在线播放| 三级精品视频久久久久| 国产精品爽爽爽爽爽爽在线观看| 国产亚洲日本欧美韩国| 久久久精品一区二区| 欧美日韩成人精品| 欧美日韩在线影院| 欧美激情一区二区三区久久久| 精品无人区乱码1区2区3区在线| 26uuu国产精品视频| 久久久亚洲天堂| 亚洲天堂久久av| 欧美成aaa人片在线观看蜜臀| 91精品久久久久久久久| 岛国av一区二区在线在线观看| 在线成人激情视频| 亚洲福利在线观看| 久久久精品亚洲| 国产69精品久久久久9| 欧美日韩中文字幕综合视频| 色琪琪综合男人的天堂aⅴ视频| 日本成人在线视频网址| 亚洲国产91色在线| 成人高清视频观看www| 欧美午夜无遮挡| 亚洲欧洲在线看| 国产欧美一区二区三区四区| 欧美猛交ⅹxxx乱大交视频| 97色在线播放视频| 成人性教育视频在线观看| 国产精品久久久久久av下载红粉| 国产精品444| 亚洲欧洲日韩国产|