java之映射
?1.獲取字節碼文件對象(3種)
//1)用對象名調用類名p1.getclass()Person p1 = new Person();Class<? extends Person> c1 = p1.getClass();//2)用類調用class,注意此時class相當于數組的length屬性Class<Person> c2 = Person.class;System.out.println(c1 == c2);//結果顯示為TRUE(類只被加載一次,因此c1和c2用的同一個類)System.out.println("++++++++++++++++++++++");//3)用Class調forname(獲取目標類的地址,注意要帶雙引號!!!!!),// 因此反射的優點之一就是解耦合因為它可以精確的指向它所要指向的類Class<?> c3 = Class.forName("leipackage.Person");System.out.println(c3 == c2);System.out.println("++++++++++++++++++++++++++++++++++");2.用字節碼調構造函數(4種) Constractor
//2.用字節碼對象調構造函數(4種),// 獲取的構造函數輸出值為構造函數的詳細信息即 訪問權限修飾符.包名.類名;// 且獲取多個類時要進行判斷和遍歷//1)用字節碼對象獲取指定單個公共構造函數,若有參則用形參數據類型.class設置映射構造的形參//若無參則不用管//總結:輸出結果為 public leipackage.Person() public 包名.類名()Constructor<?> con1 = c3.getConstructor();System.out.println(con1);System.out.println("+++++++++++++++++++++++++++++++++++++++");//2)getConstructors獲取所有公共構造函數,先判斷在進行遍歷!Constructor<?>[] con2 = c3.getConstructors();//需要判斷if (con2 != null) {//遍歷for (Constructor con : con2) {System.out.println(con);System.out.println("++++++++++++++++++++++++++++");}}//3)getDeclaredConstructors()獲取所有的(公共的 私有的 保護的 默認的)Constructor<?>[] con3 = c3.getDeclaredConstructors();//判斷if(con3 != null){//遍歷for (Constructor co:con3) {System.out.println(co);System.out.println("+++++++++++++++++++++++++++++++++");}}//4)獲取指定構造函數Constructor<?> con4 = c3.getDeclaredConstructor(String.class,int.class);//默認兩參System.out.println(con4);System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++");3. 用構造函數對象創建對象newInstance(2種只能用指定公共構造函數或者指定單個構造函數進行創建)
3.用構造函數創建對象//1)用公共無參創建Object o = con1.newInstance();System.out.println(o);System.out.println("+++++++++++++++++++++++++++++++++++");//2)用默認兩參創建,傳入實參//除過公共的構造函數,其余的都要進行壓制檢查 構造函數.setcon4.setAccessible(true);Object o1 = con4.newInstance("張三",20);//數字直接寫數字就行System.out.println(o1);System.out.println("++++++++++++++++++++++++++++++++");4.通過字節碼對象給成員變量賦值 Field()
4.通過字節碼對象給成員變量賦值(2步:先獲取成員變量(字節碼對象.getField() 再為成員變量賦值(nameField.set()))//一次獲取多個屬性對象時要進行判斷和進行遍歷,且所有的屬性輸出結果是:訪問權限修飾符 全限定包名.屬性名//1)getFields()通過字節碼對象獲取所有公共成員變量Field[] f1 = c1.getFields();if (f1 !=null){for (Field file:f1) {System.out.println(file);}System.out.println("++++++++++++++++++++++");}//2)getDeclaredFields()獲取所有類型的成員變量Field[] f2 = c1.getDeclaredFields();if (f2 != null){for (Field fi:f2) {System.out.println(fi);}System.out.println("++++++++++++++++++++++++++++++++");}//通過getDeclaredField("成員變量名")獲取指定(公共 私有 默認)成員變量,并通過所創建的對象為其賦值//對于無參公共構造函數可以用字節碼對象直接創建對象Person person = c1.newInstance();Field name1 = c1.getDeclaredField("name");Field age = c1.getDeclaredField("age");Field address = c1.getDeclaredField("address");//對于私有屬性要壓制檢查age.setAccessible(true);address.setAccessible(true);address.set(person,"中國廣東");age.set(person,20);name1.set(person,"李小龍");Field name = c1.getField("name");//可以改值,對于同一個對象name.set(person,"張三豐");System.out.println(person);總結:
??????? 1)對于無參公共構造函數可以直接通過字節碼對象.newinstance進行創建
??????? 2)getField用于獲取屬性對象,后面直接用雙引號寫入成員變量的名字
??????? 3)set用于賦值,且用set對屬性進行賦值時其參數有兩個,一參為該類創建的對象且當其類中有公共無參構造函數時可以用字節碼對象直接newinstance進行創建.
5通過字節碼文件對象調方法Method
5.用字節碼文件對象調方法Method//1)通過字節碼對象調getMethods()獲取所有公共方法對象Method[] method1 = c3.getMethods();if (method1 != null){for (Method me:method1) {System.out.println(me);}System.out.println("+++++++++++++++++++++++++++++++++");}//2)通過字節碼對象調取getDeclaredMethods()所有方法(公共 私有 默認 受保護)對象不含Object的方法Method[] methods2 = c3.getDeclaredMethods();if (methods2 != null){for (Method m2:methods2) {System.out.println(m2);}}//3)通過字節碼對象調取c3.getMethod()獲得指定公共方法Method method3 = c3.getMethod("show");//4)tog字節碼對象調取getDeclaredMethod()指定方法(公共 私有 默認 受保護)Method method4 = c3.getDeclaredMethod("method", String.class);//通過方法對象為方法設置實參method4.setAccessible(true);method4.invoke(person,"hello,劉亦菲!");總結:
??????? 1)與給成員變量賦值一樣,分兩步
??????????????? 先獲取方法對象getMethod 再用方法對象.invoke
??????? 2)賦值時與給成員變量賦值的方法一致,一參為對象,二參為方法的實參.沒有則不寫
總結
- 上一篇: python批量制作ppt_实例25_批
- 下一篇: Python数学建模入门【1】