大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 java反射獲取方法以及java反射調用方法

java反射獲取方法以及java反射調用方法

更新時間:2019-08-10 09:00:00 來源:動力節點 瀏覽2772次

  

   

      今天動力節點java學院小編為大家整理了“java反射獲取方法以及java反射調用方法”,具體內容和小編一起來看看吧。


Java反射獲取方法


1、先找到方法所在類的字節碼


2、找到需要被獲取的方法


Class類中獲取方法:


public Method[] getMethods();//獲取包括自身和繼承(實現)過來的所有的public方法——Method不支持泛型<>,即后面不接<>


public Method[] getDeclaredMethods();//獲取自身所有的方法(private、public、protected,和訪問權限無關),不包括繼承的


public Method[] getMethod(String methodName, Class<T>...parameterTypes);//表示獲取指定的一個公共的方法,包括繼承的


參數

       methodName:表示獲取的方法的名字


       parameterTypes:表示獲取的方法的參數的Class類型


public Method[] getDeclaredMethod(String methodName, Class<T>...parameterTypes);//表示獲取本類中的一個指定的方法(private、protected、public,與訪問權限無關),不包括繼承的方法


 

通過java反射調用方法


1、先找到方法所在類的字節碼


2、找到需要被獲取的方法


3、調用該方法


class User{


public void sayHello(){...}


public void sayHi(String naem){...}


private  void sayGoodBye(String name, int age){...}


}

 

如何使用java反射調用一個方法?


在Method類中有一個方法:


public Object invoke(Object  obj,  Object...  args);//表示調用當前Method所表示的方法


     參數

             obj: 表示被調用方法底層所屬對象


             args: 表示調用方法時傳遞的實際參數


     返回:方法調用后,底層方法的返回結果


Eg:   public  String  sayYa(String name){....}


Class<User> clz=User.class;


Method mt=clz.getMethod(“sayYa”, String.class);


Object obj=clz.newInstance();


Object ret=mt.invoke(obj, “wili”);//要調用實例方法,必須有一個對象,方法的底層對象就是指當前Method所在的類的實例對象,sayHi方法具有返回值,調用該方法后的返回結果使用Object接收

 

調用私有方法


Method mt=clz.getDeclaredMethod(“sayGoodBye”, String.class, int.class);


在調用私有方法之前,需設置該方法為可訪問的權限:——否則會報錯


mt.setAccessible(true);


mt.invoke(clz.newInstance(), “limi”, 17);


 

調用靜態方法


class User{


public static void staticMethod(){


   System.out.println(“static mthod invoke.”);


}


}


Eg:


Class<User> clz=User.class;


Method staticMethod=clz.getMethod(“staticMthod”);



兩種方式調用靜態方法:


1、因為靜態方法屬于所有實例對象公共的,可以創建該類的一個任意對象,通過該對象調用


 staticMethod.invoke(clz.newInstance());//staticMethod無參,故參數列表類型不填


2、如果底層方法是靜態的,那么可以忽略指定的obj參數,將obj參數設置為null即可


staticMethod.invoke(null);

 

 

使用反射調用可變參數的方法


class User{


public static int  sum(int... ages){


   System.out.println(args);//打印結果可看出:可變參數底層就是一個數組


   Int sum=0;


   for(int i : args){


      Sum+=i;


   }


return sum;


}


public static void show(String... args){...}


}


Eg:


Class<User> clz=User.class;


Method m=clz.getMethod(“sum”, int[].class);//可變參數底層就是一個數組


M.invoke(null,  new int[]{1,2,3});


Method m=clz.getMethod(“show”, String[].class);


M.invoke(null,  new String[]{“A”,”B”,”C”});//會報錯,可變參數是引用類型時,底層會自動解包,上述調用被解包后變成M.invoke(null,“A”,”B”,”C”);——為了解決該問題,我們再使用一層數組把實際參數包裝起來


M.invoke(null,  new Object[]{new String[]{“A”,”B”,”C”}});//正確

 

通用方法:


以后在使用反射調用invoke方法時,在傳遞實際參數的時候,無論是基本數據類型,還是引用類型,或者是可變參數類型,把實際參數都包裝在一維數組中。


m.invoke(方法的底層對象,new Object[]{實際參數});


Eg:


m.invoke(null, new Object[]{17});//方法參數為基本類型,且只有一個參數,解包后變成m.invoke(null,17});


m.invoke(null, new Object[]{“xxx”});//方法參數為String類型,且只有一個參數


m.invoke(null, new Object[]{new int[]{1,2}});//方法參數為int類型,且為可變參數或者數組類型


m.invoke(null, new Object[]{new String[]{“A”,”B”}});//方法參數為String類型,且為可變參數或者數組類型,new String[]{“A”,”B”}為傳遞的實際參數


以上是動力節點java學院小編介紹的“java反射獲取方法以及java反射調用方法”的內容,希望對各位java程序員有用,更多精彩內容請繼續關注動力節點java學院官網。


 

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 国产1区 | 日韩在线视频在线 | 国产最新一区二区三区天堂 | 狠狠色婷婷丁香六月 | 波多野结衣日韩 | 天天艹天天操 | 天堂成人在线 | 一级寡妇乱色毛片全18 | 欧美孕妇乱大交xxxxx | 久久久99精品免费观看精品 | 深夜免费福利视频 | 欧美三级成人理伦 | 成人午夜精品久久久久久久小说 | 国产乳摇福利视频在线观看 | 成人免费观看网欧美片 | 色涩网站在线观看 | 一级片一级毛片 | 97精品国产高清久久久久蜜芽 | 西西做人爱免费视频 | 免费看曰批女人爽的视频网址 | 91糖心| 久久综合狠狠综合久久综合88 | 亚洲a区视频 | 亚洲国产精品yw在线观看 | 久久精品视频一区二区三区 | 国产综合久久久久久 | 亚洲一级视频在线观看 | 久久精品国产欧美日韩亚洲 | 久久se精品一区二区影院 | 日韩一区二区超清视频 | 精品国产精品久久一区免费式 | 日本a一级毛片免费观看 | 全部免费国产潢色一级 | 婷婷色站 | 亚洲成年人在线 | 午夜dj影院在线视频观看完整 | 国产欧美一区二区精品仙草咪 | 99热久久只有精品99只有精品 | 波多野结衣亚洲一区二区三区 | 九九精品视频在线观看九九 | 伊人久久精品成人网 |