1. 程式人生 > 實用技巧 >通過反射機制獲取class中的屬性

通過反射機制獲取class中的屬性

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