得到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 ); }