java反射——字段


       大家都知道反射技術在Java里面時非常重要的一個技術點,因為Java好多框架的編寫都是基於反射的,別的不多說,spring框架里面的IOC就是基於反射實現。那么什么是反射呢?JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱為java語言的反射機制。說白了,反射就是加載類,並且反射出類的各個組成部分的一種實現方式。

       Java是一種面向對象的語言,它使用一個類中的字段對數據進行分裝,這樣的話可以方便類的操作和描述,下面的例子將演示如何利用反射獲取類的字段。

1.創建一個簡單的Person類

 

package com.day09;

public class Person {
    public String name = "zhangsan";
    private int age = 23;
    public static String country = "China";

}

 

2.利用Junit來演示進行演示測試

package com.day09;

import java.lang.reflect.Field;

import org.junit.Test;

public class ReflectFieldDemo {

    /**
     * 反射類的字段 public String name = "zhangsan";
     * 
     * @throws Exception
     */
    @Test
    public void reflectPublicField() throws Exception {
        // 將person類加載到內存中
        Class<?> clazz = Class.forName("com.day09.Person");
        // 通過clazz創建一個對象
        Person p = (Person) clazz.newInstance();
        // 通過字段的名字獲取對應的字段
        Field filed = clazz.getField("name");
        // 獲取字段的類型
        Class type = filed.getType();
        System.out.println(type);
        // 傳入一個對象,來獲取該對象的值
        Object obj = filed.get(p);
        if (type.equals(String.class)) {
            String value = (String) obj;
            System.out.println(value);
        }
        // 賦值
        filed.set(p, "王五");
        System.out.println(p.name);

    }

    /**
     * 反射類的字段 private int age = 23;
     * 
     * @throws Exception
     */
    @Test
    public void reflectPrivateField() throws Exception {
        // 將person類加載到內存中
        Class<?> clazz = Class.forName("com.day09.Person");
        // 通過clazz創建一個對象
        Person p = (Person) clazz.newInstance();
        // 因為是私有字段,需要通過getDeclaredField該方法傳入字段的名字獲取對應的字段
        Field filed = clazz.getDeclaredField("age");
        // 釋放權限,設為可見
        filed.setAccessible(true);
        // 獲取字段的類型
        Class type = filed.getType();
        System.out.println(type);
        // 傳入一個對象,來獲取該對象的值
        Object obj = filed.get(p);
        if (type.equals(int.class)) {
            int value = (int) obj;
            System.out.println(value);
        }
    }

    /**
     * 反射類的字段 public static String country = "China";
     * 
     * @throws Exception
     */
    @Test
    public void reflectStaticField() throws Exception {
        // 將person類加載到內存中
        Class<?> clazz = Class.forName("com.day09.Person");
        // 通過字段的名字獲取對應的字段
        Field filed = clazz.getField("country");
        // 獲取字段的類型
        Class type = filed.getType();
        System.out.println(type);
        // 因為是靜態的無需傳入對象,來獲取該類該對象的值
        Object obj = filed.get(null);
        if (type.equals(String.class)) {
            String value = (String) obj;
            System.out.println(value);
        }
    }
}

 

至此,我們已將常見的幾種通過反射獲得類中字段的方法演示完畢,有不足的地方,希望大家多多提意見!

 


免責聲明!

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



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