1. 程式人生 > 實用技巧 >反射Class物件功能Field、Constructor、Method

反射Class物件功能Field、Constructor、Method

獲取成員變數們程式碼演示:

package cn.chunzhi.reflect;

import cn.chunzhi.domain.Person;

import java.lang.reflect.Field;

public class Test02ReflectField {
    public static void main(String[] args) throws Exception {
        // 1.獲取Person的Class物件
        Class<Person> personClass = Person.class;
        
/* 獲取成員變數們: Field[] getFields() Field getField(String name) Field[] getDeclaredFields() Field getDeclaredFields(String name) */ // Field[] getFields():獲取所有public修飾的成員變數 Field[] fields = personClass.getFields();
for (Field field : fields) { System.out.println(field); } // Field getField(String name):獲取指定名稱的public修飾的成員變數 System.out.println("==============================="); Field a = personClass.getField("a"); // 獲取成員變數a的值 Person p = new Person(); Object value
= a.get(p); System.out.println(value); // 設定a的值 a.set(p, "迪麗熱巴"); System.out.println(p); System.out.println("==============================="); // Field[] getDeclaredFields():獲取所有的成員變數,不考慮修飾符 Field[] declaredFields = personClass.getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println(declaredField); } // Field getDeclaredFields(String name)d Field d = personClass.getDeclaredField("d"); // 忽略訪問許可權修飾符的安全檢查 d.setAccessible(true); // 暴力反射 Object value02 = d.get(p); System.out.println(value02); } }

獲取構造方法們程式碼演示:

package cn.chunzhi.reflect;

import cn.chunzhi.domain.Person;

import java.lang.reflect.Constructor;

public class Test03ReflectConstructor {
    public static void main(String[] args) throws Exception {
        // 1.獲取Person的Class物件
        Class<Person> personClass = Person.class;
        /*
            獲取構造方法們:
                Constructor<?>[] getConstructors()
                Constructor<T> getConstructor(類<?>... parameterTypes)

                Constructor<T> getDeclaredConstructor(類<?>... parameterTypes)
                Constructor<?>[] getDeclaredConstructor()
         */
        // Constructor<T> getConstructor(類<?>... parameterTypes)
        // 構造器就是用來建立物件的他的方法就是newInstance,這個方法中的...意思是傳遞可變參
        Constructor<Person> constructor = personClass.getConstructor(String.class, int.class);
        System.out.println(constructor);
        // 建立物件
        Person p = constructor.newInstance("古力娜扎", 23);
        System.out.println(p); // Person{name='古力娜扎', age=23, a='null', b='null', c='null', d='null'}

        // 空參構造
        Constructor<Person> constructor02 = personClass.getConstructor();
        Person p02 = constructor02.newInstance();
        System.out.println(p02);

        // 空參構造可以簡化
        Person p03 = personClass.newInstance(); // newInstance在JDK 9已經被getDeclaredConstructor()代替
        System.out.println(p03);
    }
}

獲取成員方法們與獲取類名演示:

package cn.chunzhi.reflect;

import cn.chunzhi.domain.Person;

import java.lang.reflect.Method;

public class Test04ReflectMethod {
    public static void main(String[] args) throws Exception{
        // 1.獲取Person的Class物件
        Class<Person> personClass = Person.class;
        /*
            獲取成員方法們:
                Method[] getMethod()
                Method getMethod(String name, 類<?>... parameterTypes)

                Method[] getDeclaredMethods()
                Method getDeclaredMethod(String name, 類<?>... parameterTypes)
         */
        // 獲取指定名稱的方法,空參
        Method eat_method = personClass.getMethod("eat");
        Person p = new Person();
        // 執行方法
        eat_method.invoke(p);

        // 獲取指定名稱的方法,有參
        Method eat_method02 = personClass.getMethod("eat", String.class);
        // 執行方法
        eat_method02.invoke(p, "飯");

        // 獲取所有public修飾的方法
        System.out.println("============================");
        Method[] declaredMethods = personClass.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            // 獲取方法名
            String name = declaredMethod.getName();
            System.out.println(declaredMethod + ":方法名" + name);
        }

        // 獲取類名
        String name = personClass.getName();
        System.out.println(name);
    }
}