Java 反射機制之獲取成員變量、構造器及成員方法介紹及案例

(1)反射獲取成員變量 

import java.lang.reflect.Field;

/*
    反射:
        (1) 獲取Class類對象: Class class;
        (2) 獲取成員變量
            Field[] getFields();獲取用public修飾的成員變量
            Field getField(String name);獲取用public修飾的指定方法名的成員變量

            Field[] getDeclaredFields();獲取所有成員變量,包含private修飾的變量
            Field getDeclaredField(String name);獲取指定變量名稱的成員變量,可以獲取private修飾的成員變量

            對成員變量進行賦值和取值
                void set(Object obj,Object value);對成員變量進行賦值
                get(Object obj);獲取成員變量的值
            對私有成員變量進行操作時,需要忽略訪問修飾符的安全檢查。代碼如下
                setAccessible(true);忽略暴力反射
 */
public class Demo {
    //反射機制獲取成員變量的方法案例
    public static void main(String[] args) throws Exception {
        //獲取person類的class對象
        Class<person> personClass = person.class;
        //獲取public修飾的成員變量
        Field[] fields = personClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        //獲取指定名稱的成員變量
        Field a = personClass.getField("a");
        //對指定名稱的成員變量進行操作,get和set方法中必須傳入成員變量所在的對象
        person person = new person();
        a.set(person,"AA");//對person對象中的成員變量a進行賦值
        Object o = a.get(person);//獲取person對象中成員變量a的值
        System.out.println(o);

        //獲取所有的成員變量
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        //獲取指定名稱的成員變量(任何訪問修飾符)
        Field name = personClass.getDeclaredField("name");
        //忽略訪問修飾符安全權限
        name.setAccessible(true);
        name.set(person,"BB");//對person對象中的成員變量name進行賦值
        System.out.println(name.get(person));

    }

}

(2)反射獲取構造器及成員方法


import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * 反射
 *  獲取構造方法
 *  (1)Constructor<?>[] getConstructors();獲取類的字節碼文件中所有的public修飾的構造器,之後調用newInstance獲取對象
 *  (2)Constructor<T> getConstructor(類<?>... parameterTypes)獲取類的字節碼文件中指定的public修飾的構造器
 *
 *  (3)Constructor<?>[] getDeclaredConstructors();
 *  (4)Constructor<T> getDeclaredConstructor(類<?>... parameterTypes);
 *
 *  常用方法
 *  (1)newInstance();用於創建對象
 *
 *  獲取成員方法
 *  (1)Method[] getMethods();獲取類的字節碼文件中的所有public修飾的成員方法
 *  (2)Method getMethod(String name,類<?>... parameterTypes);
 *
 *  (3)Method[] getDeclaredMethods();
 *  (4)Method getDeclaredMethod(String name,類<?>... parameterTypes);
 *
 *  常用方法
 *  (1)Object invoke(Object obj,Object... args);執行獲取到的method方法
 *  (2)getName();獲取方法名稱
 */
public class Demo01 {
    public static void main(String[] args) throws Exception {
        //獲取person的calss對象
        Class<person> personClass = person.class;

        //獲取構造方法
        Constructor<person> constructor = personClass.getConstructor(String.class, int.class);
        //利用newInstance()方法獲取一個對象
        person person = constructor.newInstance("AA", 18);
        System.out.println(person);

        //獲取字節碼文件中的成員方法
        Method eat = personClass.getMethod("eat");
        person p = new person();
        //執行invoke方法
        eat.invoke(p);

    }
}

person對象

package com.njau.day04;

import java.io.Serializable;
import java.util.Objects;

public class person implements Comparable<person>, Serializable {


    public String a;
    private String name;
    private int age;

    public person() {
    }

    public person(String name) {
        this.name = name;
    }

    public person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


    @Override
    public boolean equals(Object o) {
        System.out.println(getClass());//通過反射獲取當前類的類型,即person
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        person person = (person) o;
        return age == person.age &&
                Objects.equals(name, person.name);//使用Objects中的equals方法,可以避免空指針異常
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(person o) {
        return this.getAge()-o.getAge();//按年齡升序排序
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章