1. 程式人生 > >利用java反射調用類的屬性和方法

利用java反射調用類的屬性和方法

strong lec 測試結果 正在 bject cte static err ucc

十一結束了,盼望著的十一要做的事情也沒有做成。有時候的預期和現實總是有些許的變故,Economic freedom--閑扯結束。今天,就簡單點。

一、定義

java反射:程序運行時,通過反射獲取類的所有屬性和方法, 動態創建對象,調用對象的屬性和方法。

二、Method

        是位於java.lang.reflect包下
        在java反射中
        共有四種方法:
        1、getMethods();獲得類的public類型方法
        2、getMethod(String name, params);獲得類的特定方法
        name 參數指定的方法名字、params方法對應的參數
        3、getDeclaredMethods();獲取類中所有方法(public、protected、default、private)
        4、getDeclaredMethod(String name, params);獲得類的特定方法
        invoke(Object obj, Object arg[]);方法接收的參數必須為對象

三、定義測試類

package com.css.java.learning.massbag;

public class AllMethod {
    /*定義兩個私有屬性
     */
    private String name;//測試屬性獲取
    private String sex;//測試獲取所有私有屬性
    /*定義一個有參,公有構造函數
     */
    public static String youcan(String aa){
        System.err.println("java通過反射操作方法:有參" + aa);
        return "success";
    }
    /*定義一個無參,公有構造函數
     */
    public static void wucan(){
        System.err.println("java通過反射操作方法:無參");
    }

    /*定義一個無參,私有構造函數
     */
    @SuppressWarnings("unused")
    private static void siyou(){
        System.err.println("java通過反射操作方法:私有");
    }
    /*測試私有屬性調用和賦值
     */
    @SuppressWarnings("unused")
    private void shuxing(){
        System.err.println(name + "正在利用java反射調用私有屬性");
    }
    /*測試私有屬性調用和賦值
     */
    @SuppressWarnings("unused")
    private void allshuxingh(){
        System.err.println(name + sex);
    }

}

四、java反射技術的實現

//通過反射操作方法
    public static void main(String[] args) {
        AllMethod test = new AllMethod();
        Class<?> allm =  test.getClass();
        try {

            Method  m;
            /*公有方法調用
             */
            //有參數
            m =  allm.getMethod("youcan", String.class);
            m.invoke(test, "有參數的調用!");//對象和參數
            //無參數
            m =  allm.getMethod("wucan");
            m.invoke(test);
            /*
             * 私有方法調用
             */
            m = allm.getDeclaredMethod("siyou");
            m.setAccessible(true);
            m.invoke(test);
            /*獲取私有屬性
             * 和私有屬性的賦值
             */
            Field filed = allm.getDeclaredField("name");//獲取單個私有屬性
            //設置訪問私有屬性權限
            filed.setAccessible(true);
            //調用和設置私有變量屬性
            filed.set(test, "測試私有屬性賦值");
            m = allm.getDeclaredMethod("shuxing");
            m.setAccessible(true);
            m.invoke(test);

            Field[] fid = allm.getDeclaredFields();//獲取所有私有屬性
            for (int i = 0; i < fid.length; i++) {
                fid[i].setAccessible(true);//權限訪問私有屬性
                fid[i].set(test, i + "測試20181008");
            }
            m = allm.getDeclaredMethod("allshuxingh");
            m.setAccessible(true);//權限訪問私有方法
            m.invoke(test);

        } catch (Exception e) {
            e.printStackTrace();
        } 
    }

五、測試結果

技術分享圖片

利用java反射調用類的屬性和方法