/**每天進步一點點
*/
//該包讀取的是properties檔案中的內容PersonType=com.anby.damain.Person
package com.anby.demo; import java.lang.reflect.Field;import java.util.HashMap;import java.util.Map;import java.util.ResourceBundle; public class Reflect { public static void main(String[] args)throws Exception {//設定資料集Map<String,String> dataMap=new HashMap<String,String>();dataMap.put("name", "Anby");dataMap.put("age", "20");dataMap.put("sex", "man");dataMap.put("qq", "190241347");dataMap.put("Email", "ailaohuyou123@yahoo.com"); Class clzz=Class.forName(getProperties("PersonType"));//若此處報異常,說明檔案存取權限不夠(java.lang.IllegalAccessException) //獲取執行個體對象 Object obj=clzz.newInstance(); //擷取所有對象中的欄位 Field[] field=clzz.getDeclaredFields(); for (Field f : field) { f.setAccessible(true); String fieldname=f.getName(); String value=dataMap.get(fieldname); if(value!=null) { f.set(obj, value); } } System.out.println(obj);} public static String getProperties(String key) {//*擷取properties下的欄位 //1,指定資源檔名稱 ResourceBundle rb=ResourceBundle.getBundle("Data"); //2,擷取資源檔中相應欄位的值 String type=rb.getString(key); return type;} }
package com.anby; import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method; //簡單瞭解反射public class ClssDemo {public static void main(String[] args) throws Exception{Class cls=Class.forName("com.anby.Student"); Object obj=cls.newInstance(); Method[] m=cls.getDeclaredMethods(); for(int i=0;i<m.length;i++) { System.out.println(m[i].getName());//方法是列印不出來結果的,只能調用 } Method m1=cls.getDeclaredMethod("print",null); //Method m1=cls.getDeclaredMethod("print",String.class,int.class); m1.invoke();//調用該方法} public static void getConstructor() throws Exception{String stu="com.anby.Student";//通過位元組碼擷取類名稱 並存放到記憶體Class clss=Class.forName(stu); //擷取該類的預設建構函式Constructor cons1=clss.getConstructor(null);System.out.println(cons1); //擷取該類的的執行個體 \//兩種調用預設構造的方法//1,通過建構函式Constructor對象擷取Object obj1=cons1.newInstance(null);//2,通過Class對象獲得Object obj2=clss.newInstance(); //獲得指定參數的建構函式(包括私人)Constructor cons2=clss.getDeclaredConstructor(String.class,Integer.class);//設定存取權限cons2.setAccessible(true);//使用私人建構函式進行初始化Object obj3=cons2.newInstance("asd",123);} public static void getField() throws Exception{//同理,欄位,方法,以及枚舉都可以擷取// Field[] field= clss.getDeclaredFields();// System.out.println(field);Class c=Class.forName("com.anby.Student");Object obj4=c.newInstance(); Field namef=c.getDeclaredField("name");Field agef=c.getDeclaredField("age"); namef.setAccessible(true);// 訪問私人欄位時,若不加這句話,會拋出java.lang.IllegalAccessExceptionnamef.set(obj4, "james");Object namevalue= namef.get(obj4); agef.get(obj4);agef.set(obj4, 123);Object agevalue=agef.get(obj4); System.out.println(namevalue);System.out.println(agevalue);//設定age值}} class Student{private String name="anby";public int age=18; public Student() { System.out.println("預設建構函式"); } private Student(String name,Integer age) { System.out.println("帶參數的建構函式"); } public void print() { System.out.println("print"); }} |