通過反射機制獲取class中的屬性
阿新 • • 發佈:2020-09-04
Student類:
package com.javaSe.bean; // 反射屬性Field public class Student { // Field翻譯為欄位,其實就是屬性/成員 // 4個Field,分別採用了不同的訪問控制權限修飾符。 private String name; // Field物件。 protected int age; boolean sex; public int no; // Field物件。 public static final double MATH_PI = 3.1415926; }
通過反射機制獲取Student中的屬性案例1:
package com.javaSe.reflect; import java.lang.reflect.Field; import java.lang.reflect.Modifier; /* 反射Student類中的所有的Field(瞭解一下) */ public class ReflectTest05 { public static void main(String[] args) throws Exception{ // 獲取整個類 Class c = Class.forName("com.javaSe.bean.Student");// com.javaSe.bean.Student String className = c.getName(); // 獲取的是完整類名 System.out.println("完整類名" + className); String simpleName = c.getSimpleName(); // 獲取的是簡類名 System.out.println("簡類名" + simpleName); // 獲取類中所有public修飾的Field Field[] fields = c.getFields(); System.out.println(fields.length);// 測試陣列中只有一個元素 // 取出這個Field Field f = fields[0]; // 取出這個Field他的名字 String fieldName = f.getName(); System.out.println(fieldName); System.out.println("=============================================="); // 獲取所有的Field Field[] fs = c.getDeclaredFields(); System.out.println(fs.length); for(Field field : fs){ // 獲取屬性的修飾符列表 int modifiers = field.getModifiers();// 返回的修飾符是一個數字,每個數字是修飾符的代號! System.out.println(modifiers); // 可以將這個“代號”數字轉換成“字串”嗎? String mdifierString = Modifier.toString(modifiers); System.out.println(mdifierString); // 獲取屬性的型別 Class fileType = field.getType(); // String fName = fileType.getName(); String fName = fileType.getSimpleName(); System.out.println(fName); // 獲取屬性的名字 String fieldsName = field.getName(); System.out.println(fieldsName); } } }
通過反射機獲取類中的屬性
package com.javaSe.reflect; import java.lang.reflect.Field; import java.lang.reflect.Modifier; /* 通過反射機制(瞭解一下) */ public class ReflectTest06{ public static void main(String[] args) throws Exception{ // 建立這個是為了拼接字串 StringBuilder s = new StringBuilder(); // Class studentClass = Class.forName("com.javaSe.bean.Student"); Class studentClass = Class.forName("java.lang.Thread"); s.append(Modifier.toString(studentClass.getModifiers()) + " class "+ studentClass.getSimpleName() +" {\n"); Field[] fields = studentClass.getDeclaredFields(); for(Field field : fields){ s.append("\t"); s.append(Modifier.toString(field.getModifiers())); s.append(" "); s.append(field.getType().getSimpleName()); s.append(" "); s.append(field.getName()); s.append(";\n"); } s.append("}"); System.out.println(s); } }
通過反射機制給一個java物件賦值和獲取值
package com.javaSe.reflect; import com.javaSe.bean.Student; import java.lang.reflect.Field; /* 必須掌握: 怎麼通過反射機制訪問一個java物件的屬性? 給屬性賦值set 獲取屬性的值get */ public class ReflectTest07 { public static void main(String[] args) throws Exception{ /*// 我們不使用反射機制,怎麼去訪問一個物件的屬性呢? Student student = new Student(); // 給屬性賦值 student.no = 1111; // 三要素: 給s物件的no屬性賦值1111 // 要素一:物件s // 要素二:no屬性 // 要素三:1111 // 讀取屬性 // 兩個要素:獲取s物件的no屬性的值 System.out.println(student.no);*/ // 使用反射機制,怎麼去訪問一個物件的屬性。(set get) Class studentClass = Class.forName("com.javaSe.bean.Student"); Object obj = studentClass.newInstance();// obj就是Student物件。(底層呼叫無引數構造方法) // 獲取no屬性(根據屬性的名稱來獲取Field) Field noField = studentClass.getDeclaredField("no"); // 給obj物件(student物件)的no屬性賦值 /* 雖然使用了反射機制,但是三要素還是缺一不可: 要素1:obj物件 要素2:no屬性 要素3:2222 注意:反射機制讓程式碼複雜了,但是為了一個“靈活”,這也是值得的。 */ noField.set(obj,2222);// 給obj物件的no屬性賦值2222 // 讀取屬性的值 // 兩個要素:獲取obj物件的no屬性的值。 System.out.println(noField.get(obj)); // 可以訪問私有的屬性嗎? Field nameField = studentClass.getDeclaredField("name"); // 打破封裝(反射機制的缺點:打破封裝,可能會給不法分子留下機會!!!) // 這樣設定完之後,在外部也是可以訪問private的。 nameField.setAccessible(true); // 給name屬性賦值 nameField.set(obj,"zhangsan"); // 獲取name屬性的值 System.out.println(nameField.get(obj)); } }