java反射

得到Class對象的三種方式java

//參數必須是完整包名+類名
Class<?> obj1=Class.forName("java.lang.String");
//經過直接使用類的class屬性(相對於第一種推薦第二種)
Class<?> obj2=String.class;
String str="";
//經過調用實例的getClass方法
Class<?> obj3=str.getClass();

能夠使用反射獲取指定的或者全部的(包括私有的)構造器,方法,屬性,若是是全部的則返回數組。spring

使用反射建立對象數組

//若該類沒有默認的無參構造函數會拋出異常
obj strObj=obj1.newInstance();
//使用得到的指定的構造函數建立對象
Class<?> jframeClazz=JFrame.class;
Constructor ctor=jframeClazz.getConstructor(String.class);
Object jframeObj=ctor.newInstance();

調用方法函數

//object是該方法的主調,args是該方法的執行參數
Object invoke(Object object,Object... args)

注意:當經過Method調用invoke時,java會要求程序必須有調用該方法的權限,若是程序確實須要調用某個private方法能夠先調用setAccessibel(true)爲true則表示該method在使用時應該取消java語言訪問權限檢查,取消檢查會顯著的提升性能性能

一個通用的反射方法code

public Message invoke (String instance , String methodName , String $data ) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException  {
                //獲取實例,這裏是spring中配置的bean
		Object owner = SpringBeanUtil.getBean( instance );
                //根據傳過來的參數實例化對象數組
		Object [] args = new Object [] { $data };
                //實例化參數類型的class對象
		Class <?> [] argsClass = new Class [args.length];
		for ( int i = 0, j = args.length; i < j; i++ ) {
			argsClass [i] = args [i].getClass();
		}
                //找到具體是哪一個方法
		Method method = owner.getClass().getMethod( methodName , argsClass );
                //執行具體的方法
		return (Message) method.invoke( owner , args );
	}
相關文章
相關標籤/搜索