天天看點

反射操作

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");