中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • Java怎么通過反射獲取私有構造、私有對象、私有字段、私有方法

Java怎么通過反射獲取私有構造、私有對象、私有字段、私有方法

發布時間:2021-12-14 14:04:29 來源:億速云 閱讀:316 作者:小新 欄目:開發技術

這篇文章主要介紹了Java怎么通過反射獲取私有構造、私有對象、私有字段、私有方法,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

Java反射獲取私有構造、私有對象、私有字段、私有方法

1. 創建測試的私有對象

/**
 * @author lirong
 * @desc 測試對象
 * @date 2019/06/20 20:07
 */
public class Person {
    private int age = 5;
    private String name;
    private Person(){}
    private String test(String name){
        System.out.println("name: "+name);
        return "test";
    }
}

2. 獲取私有對象中的屬性和方法

/**
 * @author lirong
 * @desc 反射獲取私有屬性和方法
 * @date 2019/06/20 20:10
 */
public class Test {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        // 1. 獲取class對象
        Class clazz = Person.class;
        // 2. 獲取私有無參構造
        Constructor c = clazz.getDeclaredConstructor();
        // 3. 設置訪問為可見
        c.setAccessible(true);
        // 4. 通過構造器創建實例對象
        Person person = (Person) c.newInstance();
        
        // 根據字段名稱獲取class中的字段
        Field age = clazz.getDeclaredField("age");
        age.setAccessible(true);
        System.out.println(age.getName() + " = " + age.get(person));
        // 修改私有變量的默認值
        age.set(person, 18);
        System.out.println(age.getName() + " = " + age.get(person));
        // 5. 獲取所有字段
        Field[] fields = clazz.getDeclaredFields();
        for (Field f : fields) {
            // 設置字段的可見性
            f.setAccessible(true);
            String name = f.getName();
            Object o = f.get(person);
            System.out.println(name + " - " + o);
        }
        // 6. 獲取所有的方法
        Method[] methods = clazz.getDeclaredMethods();
        for (Method m : methods) {
            m.setAccessible(true);
            String name = m.getName();
            Object invoke = m.invoke(person, "張三");
            System.out.println(name + " = "+invoke);
        }
    }
}

通過反射獲取私有內部類對象

首先是我們的目標對象:

class Out {
    //目標獲取Inner對象
    private class Inner {
        //內部類的私有成員屬性
        private String inner = "ccc";
    }
}

直接列出代碼

public class Main {
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static void main(String[] args) throws Exception {
        //獲取外部類
        Class clzz = Out.class;
        //獲取外部類默認無參構造方法
        Constructor con = clzz.getDeclaredConstructor();
        //實例一個外部類對象
        Out outObj = (Out) con.newInstance();
        //獲取外部類內的所有內部類
        Class innerClazz[] = clzz.getDeclaredClasses();
        //遍歷
        for (Class c : innerClazz) {
            //獲取修飾符的整數編碼
            int mod = c.getModifiers();
            //返回整數編碼對應的修飾符的字符串對象
            String modifier = Modifier.toString(mod);
            //找到被private修飾的內部類
            if (modifier.contains("private")) {
                //根據內部類的特性,需要由外部類來反射獲取內部類的構造方法(這里獲取的是內部類的默認構造方法)
                Constructor cc = c.getDeclaredConstructor(clzz);
                //由于內部類是私有的,需要強制獲取構造方法的訪問權限
                cc.setAccessible(true);
                //由外部類對象來反射獲取內部類的對象
                Object obj=cc.newInstance(outObj);
                //獲取內部類的私有成員屬性inner
                Field f=c.getDeclaredField("inner");
                //獲取訪問權限
                f.setAccessible(true);
                //獲取內部類對象obj中的私有成員屬性inner的值
                System.out.println(f.get(obj));
            }
        }
    }
}

輸出結果:

ccc

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Java怎么通過反射獲取私有構造、私有對象、私有字段、私有方法”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东莞市| 息烽县| 尚义县| 都昌县| 康乐县| 册亨县| 辽宁省| 金沙县| 阳西县| 大兴区| 凤翔县| 柳江县| 姜堰市| 凉山| 新兴县| 密云县| 栾川县| 嫩江县| 南岸区| 建平县| 湖北省| 普格县| 澎湖县| 齐齐哈尔市| 北安市| 玉环县| 金堂县| 济阳县| 阳谷县| 云和县| 深泽县| 沁水县| 嘉义市| 保山市| 绥宁县| 余江县| 肥乡县| 囊谦县| 中山市| 兴和县| 班玛县|