S要想使用反射,所有的反射都指向一個類:java.lang.Class
得到反射類
這裡有三種方式可以得到:
通過對象來擷取
Class cls = master.getClass();
通過類來擷取
Class cls = Master.class;
通過字元串,來得到Class對象,這種方式是我們使用最廣泛的一種方式,如Hibernate,mybatis的映射檔案
Class cls = Class.forName("cn.jbit.po.Master");
根據得到的Class對象,獲得相應的Master對象
調用無參構造,來獲得對象
Master master = (Master) cls.newInstance();
先獲得指定的構造,然後利用這個構造方法,來獲得對象
//得到指定的構造 方法,如果有多個參數,中間用","隔開
Constructor con = cls.getDeclaredConstructor(String.class,Integer.class);
//當沒有無參構造,或者無參構造為private修飾的時候,我們不能夠再使用newinstance的方式來執行個體化了
//這時候,我們隻能先擷取指定構造,然後再來執行個體化
Object obj = con.newInstance("abc",1);
獲得構造
//獲得所有的構造方法,private修飾的構造不能獲得
Constructor[] cons = cls.getConstructors();
for(int i=0;i<cons.length;i++){
System.out.println(cons[i]);
}
//獲得本類所有的構造方法,包括private修飾的構造
Constructor[] cons = cls.getDeclaredConstructors();
for(int i=0;i<cons.length;i++){
System.out.println(cons[i]);
}
//也可以使用另一種方式來獲得:cls.getConstructor(parameterTypes)
獲得方法
//獲得所有的方法,包括繼承自父類的方法,但隻能是public 修飾的方法
Method[] ms = cls.getMethods();
for(int i=0;i<ms.length;i++){
System.out.println(ms[i]);
//獲得本類所有的方法,不包括繼承自父類的方法,但private 修飾的方法也能獲得
Method[] ms = cls.getDeclaredMethods();
//獲得指定方法(無參)
Method ms = cls.getDeclaredMethod("show");
System.out.println(ms);
//獲得指定方法(有參)
Method ms = cls.getMethod("print", String.class);
//通過invoke調用方法,obj表示在哪個對象裡調用方法,後續的參數都是方法的傳入的參數
String str = (String) ms.invoke(obj, "測試有參方法");
System.out.println("方法執行的結果:"+str);
//因為show()方法為私有化方法,是以需要先解除封裝後,才能調用
ms.setAccessible(true);
ms.invoke(obj);
管理屬性
//獲得所有的public修飾的屬性(繼承自父類的屬性也能獲得),private修飾的屬性不能獲得
Field [] fs = cls.getFields();
for(int i=0;i<fs.length;i++){
System.out.println(fs[i]);
//獲得本類所有的屬性(繼承自父類的屬性不能獲得),private修飾的屬性也能獲得
Field [] fs = cls.getDeclaredFields();
//獲得指定的屬性
Field f = cls.getDeclaredField("mastername");
//mastername屬性為私有的,是以要先解除封裝
f.setAccessible(true);
System.out.println(f.get(obj));
//修改指定的屬性
f.set(obj, "lisi");