JavaBean:資料庫表和實體類的對應關係 1.資料庫中有一張表,就會有一個和表對應的類 資料庫:Person表 Java:Preson類 2.表中的每一列,對應Java中的一個欄位(成員變數) 3.表中的每一行,對應Java中的一個對象 張三 18 男 new Person(張三 18 男); ...
JavaBean:資料庫表和實體類的對應關係
1.資料庫中有一張表,就會有一個和表對應的類
資料庫:Person表 Java:Preson類
2.表中的每一列,對應Java中的一個欄位(成員變數)
3.表中的每一行,對應Java中的一個對象
張三 18 男 new Person(張三 18 男);
小花 18 女 new Person(小花 18 女);
多個對象可以放在一個集合中ArrayList<Person>
JavaBean包含的內容:
1.私有的成員變數
2.公共的getter/setter方法
3.空參數構造方法
4.toString方法
5.實現序列化介面
獲取class文件對象的三種方式:
1.使用Object類中的方法getClass()
Class<?> getClass() 返回此 Object 的運行時類。
2.使用類名.class屬性
每一個數據類型,基本數據類型和引用數據類型,Java都會為其設置一個class屬性
Class clazz = int.class
Class clazz = String.class
Class clazz = Person.class
3.使用Class類中的靜態方法forName
static Class<?> forName(String className)
返回與帶有給定字元串名的類或介面相關聯的 Class 對象。
註意:每個類的class文件對象只會產生一次,是唯一的
使用反射技術獲取類中的構造方法並實例化
* public Person() {}
* public Person(String name, int age, String sex) {}
* private Person(String name, int age) {}
*
* 實現步驟:
* 1.獲取Person類的class文件對象
* 2.使用class文件對象中的方法getConstructor獲取構造方法
* 3.使用Constructor中的方法newInstrance實例化構造方法
快速使用反射創建空參數對象的方法
* 使用前提:
* 1.類中必須有空參數的構造方法
* 2.空參數的構造方法的修飾符不能是私有private,建議使用public
*
* 在Class類中有一個方法
* T newInstance() 創建此 Class 對象所表示的類的一個新實例。
*
使用反射技術獲取類中的成員變數(欄位),給成員變數賦值,獲取值
* private String name;
* private int age;
* public String sex;
*
* 實現步驟:
* 1.獲取Person類的class文件對象
* 2.使用class文件對象中的方法getField獲取成員變數
* 3.使用Field中的方法get/set獲取成員變數值,給成員變數賦值
1 public static void main(String[] args) throws Exception { 2 //1.獲取Person類的class文件對象 3 Class clazz = Class.forName("cn.itcast.demo02.javabean.Person"); 4 //2.使用class文件對象中的方法getField獲取成員變數 5 /* 6 * Field[] getFields() 獲取類中所有可訪問公共欄位。 7 * Field[] getDeclaredFields() 獲取類中所有的聲明欄位,包含私有的。 8 */ 9 Field[] fields1 = clazz.getFields(); 10 for (Field field : fields1) { 11 System.out.println(field); 12 } 13 System.out.println("------------------"); 14 Field[] fields2 = clazz.getDeclaredFields(); 15 for (Field field : fields2) { 16 System.out.println(field); 17 } 18 System.out.println("------------------"); 19 20 /* 21 * Field getField(String name) 獲取類中指定公共成員欄位。 22 * Field getDeclaredField(String name) 獲取類中指定的聲明欄位,包含私有的。 23 * 參數: 24 * String name:欄位的名字 25 */ 26 //public String sex; 27 Field sexField = clazz.getField("sex"); 28 System.out.println(sexField); 29 //private String name; 30 Field nameField = clazz.getDeclaredField("name"); 31 System.out.println(nameField); 32 //private int age; 33 Field ageField = clazz.getDeclaredField("age"); 34 System.out.println(ageField); 35 36 /* 37 * 3.使用Field中的方法get/set獲取成員變數值,給成員變數賦值 38 * Object get(Object obj) 返回指定對象上此 Field 表示的欄位的值。 39 * void set(Object obj, Object value) 將指定對象變數上此 Field 對象表示的欄位設置為指定的新值。 40 * 參數: 41 * Object obj:要設置值/獲取的值的對象,可以使用反射快速創建 42 * Object value:給成員變數設置的實際值 43 * 返回值: 44 * Object:獲取成員變數的返回值 45 */ 46 //使用反射創建對象 47 Object obj = clazz.newInstance(); 48 49 //public String sex; 50 //get(obj);-->getSex(); 51 Object sexValue = sexField.get(obj); 52 System.out.println(sexValue);//預設值 null 53 54 /* 55 * private String name; 56 * 私有的屬性無法直接使用,必須先取消Java的許可權檢查(暴力反射) 57 */ 58 nameField.setAccessible(true); 59 Object nameValue = nameField.get(obj); 60 System.out.println(nameValue);//預設值 null 61 62 //private int age; 63 ageField.setAccessible(true); 64 Object ageValue = ageField.get(obj); 65 System.out.println(ageValue);//預設值 0 66 System.out.println("------------------"); 67 /* 68 * 設置成員變數的值 69 */ 70 //public String sex; 71 sexField.set(obj, "妖"); 72 //獲取值 73 sexValue = sexField.get(obj); 74 System.out.println(sexValue);//妖 75 76 //private String name; 77 nameField.set(obj, "泰國美女"); 78 //獲取值 79 nameValue = nameField.get(obj); 80 System.out.println(nameValue);//泰國美女 81 82 //private int age; 83 ageField.set(obj, 18); 84 //獲取值 85 ageValue = ageField.get(obj); 86 System.out.println(ageValue);//18 87 System.out.println(obj);//Person [name=泰國美女, age=18, sex=妖] 88 }
使用反射技術獲取類中的成員方法,並執行
* public String getName()
* public void setName(String name)
* private void method()
*
* 實現步驟:
* 1.獲取Person類的class文件對象
* 2.使用class文件對象中的方法getMethod獲取成員方法
* 3.使用Method中的方法invoke執行獲取到的方法
*
* Method類中的方法:getName,獲取方法名稱
* String getName() 以 String 形式返回此 Method 對象表示的方法名稱。
1 public static void main(String[] args) throws Exception { 2 //1.獲取Person類的class文件對象 3 Class clazz = Class.forName("cn.itcast.demo02.javabean.Person"); 4 //2.使用class文件對象中的方法getMethod獲取成員方法 5 /* 6 * Method[] getMethods() 獲取類中所有的公共方法,包含繼承父類的 7 * Method[] getDeclaredMethods() 包括公共、保護、預設(包)訪問和私有方法,但不包括繼承的方法。 8 */ 9 Method[] methods1 = clazz.getMethods(); 10 for (Method method : methods1) { 11 System.out.println(method); 12 } 13 System.out.println("----------------------"); 14 Method[] methods2 = clazz.getDeclaredMethods(); 15 for (Method method : methods2) { 16 System.out.println(method.getName()); 17 } 18 System.out.println("----------------------"); 19 /* 20 * Method getMethod(String name, Class<?>... parameterTypes) 獲取類中指定公共成員方法。 21 * Method getDeclaredMethod(String name, Class<?>... parameterTypes) 獲取類中指定的成員方法,包含私有的. 22 * 參數: 23 * String name:方法的字元串名稱 24 * Class<?>... parameterTypes:方法參數列表的class對象 25 */ 26 //public String getName() 27 Method getNameMethod = clazz.getMethod("getName"); 28 System.out.println(getNameMethod); 29 30 //public void setName(String name) 31 Method setNameMethod = clazz.getMethod("setName", String.class); 32 System.out.println(setNameMethod); 33 34 //private void method() 35 Method privateMethod = clazz.getDeclaredMethod("method"); 36 System.out.println(privateMethod); 37 38 /* 39 * 3.使用Method中的方法invoke執行獲取到的方法 40 * Object invoke(Object obj, Object... args) 41 * 參數: 42 * Object obj:要執行的方法的所屬對象 43 * Object... args:執行方法,傳遞的實際參數 44 * 返回值: 45 * Object:方法的返回值 46 * 如果方法沒有返回值,Object的值為null 47 */ 48 Object obj = clazz.newInstance(); 49 50 //public String getName() 51 Object v1 = getNameMethod.invoke(obj); 52 System.out.println(v1);//成員變數 name的預設值:null 53 54 //public void setName(String name) 55 Object v2 = setNameMethod.invoke(obj, "樓上老宋"); 56 System.out.println(v2); 57 58 v1 = getNameMethod.invoke(obj); 59 System.out.println(v1);//成員變數 name的值:樓上老宋 60 61 /* 62 * private void method() 63 * 使用暴力反射,取消Java的許可權檢查 64 */ 65 privateMethod.setAccessible(true); 66 privateMethod.invoke(obj);//私有方法 67 68 System.out.println("-------------"); 69 //獲取返回值為數組的方法 70 Method arrMethod = clazz.getMethod("methodArr"); 71 Object v3 = arrMethod.invoke(obj); 72 int[] arr = (int[]) v3; 73 System.out.println(v3); 74 System.out.println(arr); 75 for (int i : arr) { 76 System.out.println(i); 77 } 78 }
反射的綜合案例:
* 通過反射技術,獲取JavaBean的對象,給JavaBean的成員變數註入(賦)值
*
* 實現步驟:
* 1.創建JavaBean(User類)
* 2.創建data.properties配置文件,配置成員變數的實際使用的值
* 3.使用IO+Properties集合,讀取配置文件,把文件中的數據保存到集合中
* 4.使用反射技術創建JavaBean對象
* 5.遍歷Properties集合
* 6.使用Properties集合key拼接setXXX方法
* 7.使用反射技術獲取setXXX方法
* 8.使用反射技術執行setXXX方法,給成員變數註入值
1 public static void main(String[] args) throws Exception { 2 //3.使用IO+Properties集合,讀取配置文件,把文件中的數據保存到集合中 3 Properties prop = new Properties(); 4 prop.load(new FileReader("data.properties")); 5 //4.使用反射技術創建JavaBean對象 6 Class clazz = Class.forName("cn.itcast.demo02.javabean.User"); 7 Object obj = clazz.newInstance(); 8 //5.遍歷Properties集合 9 Set<String> set = prop.stringPropertyNames(); 10 for (String key : set) { 11 /* 12 * 6.使用Properties集合key拼接setXXX方法 13 * 類中的set方法: 14 * setId,setUsername,setPassword 15 * 集合的key: 16 * id,username,password 17 * 拼接的過程: 18 * 1.固定的字元串:"set" 19 * 2.獲取key的首字母,變成大寫 20 * 3.獲取key的其它字母 21 */ 22 String methodName = "set"+key.substring(0, 1).toUpperCase()+key.substring(1); 23 //System.out.println(methodName); 24 25 //7.使用反射技術獲取setXXX方法 26 Method setMethod = clazz.getMethod(methodName, String.class); 27 //8.使用反射技術執行setXXX方法,給成員變數註入值(集合的value值) 28 setMethod.invoke(obj, prop.get(key)); 29 30 /* 31 * 擴展:拼接getXXX方法 32 */ 33 String getMethodName = "get"+key.substring(0, 1).toUpperCase()+key.substring(1); 34 Method getMethod = clazz.getMethod(getMethodName); 35 Object value = getMethod.invoke(obj); 36 System.out.println(value); 37 } 38 System.out.println(obj); 39 }
使用反射技術獲取介面
* Class<?>[] getInterfaces() 確定此對象所表示的類或介面實現的介面
1 public static void main(String[] args) throws Exception { 2 //獲取介面實現類的class文件對象 3 Class clazz = Class.forName("cn.itcast.demo06.reflect.AandBImpl"); 4 //使用Class中的方法getInterfaces獲取實現的實現的介面 5 Class[] clazzs = clazz.getInterfaces(); 6 for (Class c : clazzs) { 7 System.out.println(c);//介面 8 //使用介面class文件對象,創建實現類對象,調用實現類中的方法 9 Object obj = clazz.newInstance(); 10 Method method = c.getMethod("a"); 11 method.invoke(obj); 12 } 13 }