Java-Reflect反射

反射概述:

Java反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。


GetClass {


    /*
     * Class類就是描述class文件對象的類
     *
     * 獲取class文件對象的三種方式
     *     1.Object類中的方法getClass Class<?> getClass() 返回此 Object
     * 的運行時類。
     *     2.通過類名的屬性獲取 每種數據類型(基本,引用),都會賦予該類型一個calss屬性,作用就是獲取class文件對象
     *     3.Class類中的靜態方法forName static Class<?> forName(String className)
     * 返回與帶有給定字符串名的類或接口相關聯的 Class 對象。
     *
     * 注意:class文件對象,一個類只會產生一個
     */
    public static void main(String[] args) throws Exception {
        // 1.Object類中的方法getClass Class<?> getClass()
        Bean bean = new Bean();
        Class c1 = bean.getClass();
        System.out.println(c1);

        // 2.通過類名的屬性獲取
        Class c2 = Bean.class;
        System.out.println(c2);

        // 3.Class類中的靜態方法forName(使用的最多的)
        Class c3 = Class.forName("com.simon.Bean");
        System.out.println(c3);
    }

}


GetEmptyConstructor { //快速獲取空參構造

    /*
     * 使用反射技術快速獲取空參構造方法的對象 使用的前提:
     *     1.獲取的類中必須有空參數構造方法
     *     2.空參數構造方法權限不能私有的,建議使用public,使用方便
     *
     * 使用Class類中的方法 T newInstance() 創建此 Class 對象所表示的類的一個新實例。
     */
    public static void main(String[] args) throws Exception {
        Class c1 = Class.forName("com.simon.Bean");
        Object object = c1.newInstance();
        System.out.println(object);
    }

}

GetConstructor { //獲取構造函數
    /*
     * 使用反射獲取類中的構造方法
     *
     * 使用步驟:
     *     1.獲取class文件對象
     *     2.通過class文件對象中提供的方法,獲取類中的構造方法
     *     3.把獲取到的構造方法初始化執行
     */
    public static void main(String[] args) throws Exception {
        // 1.獲取class文件對象
        Class c1 = Class.forName("com.simon.Bean");
        // 2.通過class文件對象中提供的方法,獲取類中的構造方法
        Constructor[] constructors = c1.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            // 取消Java的訪問權限檢查-->暴力反射(不推薦,破壞了類的封裝性)
            constructor.setAccessible(true);
        }
        Object object = constructors[1].newInstance("hello world", 100);
        System.out.println(object);
    }
}


GetMembers { //獲取成員變量

    /*
     * 使用反射技術獲取Bean類中的成員變量
     *
     * 使用步驟:
     *     1.獲取class文件對象
     *     2.通過class文件對象中提供的方法,獲取類中的成員變量(字段)
     *     3.可以使用字段Field中的方法,設置字段的值,獲取字段的值
     */
    public static void main(String[] args) throws Exception {
        // 1.獲取class文件對象
        Class c1 = Class.forName("com.simon.Bean");

        // 獲取所有成員變量
        Field[] fields = c1.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        // 獲取指定成員變量
        Field fieldName = c1.getDeclaredField("name");

        // 設置可訪問私有成員變量
        fieldName.setAccessible(true);

        // 獲取對象
        Object obj = c1.newInstance();
        // 賦值
        fieldName.set(obj, "lily");
        // 取值
        Object object = fieldName.get(obj);
        System.out.println(object);

    }
}


GetMethods { //獲取方法

    /*
     * 使用反射技術獲取類中的成員方法
     *
     * 使用步驟:
     *     1.獲取class文件對象
     *     2.通過class文件對象中提供的方法,獲取類中的成員方法(Method)
     *     3.可以使用字段Method中的方法,運行獲取到的方法
     */
    public static void main(String[] args) throws Exception {
        // 1.獲取class文件對象
        Class clazz = Class.forName("com.simon.Bean");
        // 2.通過class文件對象中提供的方法,獲取類中的成員方法(Method)
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            // System.out.println(method);
        }

        // 獲取指定的成員方法
        Method getName = clazz.getDeclaredMethod("getName");
        System.out.println(getName);
        Method setName = clazz.getDeclaredMethod("setName", String.class);
        System.out.println(setName);

        // 獲取bean類對象
        Object obj = clazz.newInstance();

        Object setNameObj = setName.invoke(obj, "Lily");
        Object getNameObj = getName.invoke(obj);
        System.out.println(getNameObj);
    }

}

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