通過反射機制獲取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));
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM