反射 -3 創(chuàng)建對象,訪問屬性和方法

1 創(chuàng)建對象

class User { //User類
    private int age = 10;
    private String name = "韓順平教育";

    public User() {//無參 public
    }

    public User(String name) {//public的有參構(gòu)造器
        this.name = name;
    }

    private User(int age, String name) {//private 有參構(gòu)造器
        this.age = age;
        this.name = name;
    }

    public String toString() {
        return "User [age=" + age + ", name=" + name + "]";
    }
}
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {

        //1. 先獲取到User類的Class對象
        Class<?> userClass = Class.forName("com.hspedu.reflection.User");
        //2. 通過public的無參構(gòu)造器創(chuàng)建實(shí)例
        Object o = userClass.newInstance();
        System.out.println(o);
        //3. 通過public的有參構(gòu)造器創(chuàng)建實(shí)例
        /*
            constructor 對象就是
            public User(String name) {//public的有參構(gòu)造器
                this.name = name;
            }
         */
        //3.1 先得到對應(yīng)構(gòu)造器
        Constructor<?> constructor = userClass.getConstructor(String.class);
        //3.2 創(chuàng)建實(shí)例,并傳入實(shí)參
        Object hsp = constructor.newInstance("hsp");
        System.out.println("hsp=" + hsp);
        //4. 通過非public的有參構(gòu)造器創(chuàng)建實(shí)例
        //4.1 得到private的構(gòu)造器對象
        Constructor<?> constructor1 = userClass.getDeclaredConstructor(int.class, String.class);
        //4.2 創(chuàng)建實(shí)例
        //暴破【暴力破解】 , 使用反射可以訪問private構(gòu)造器/方法/屬性, 反射面前,都是紙老虎
        constructor1.setAccessible(true);
        Object user2 = constructor1.newInstance(100, "張三豐");
        System.out.println("user2=" + user2);
    }

2 訪問屬性

class Student {//類
    public int age;
    private static String name;

    public Student() {//構(gòu)造器
    }

    public String toString() {
        return "Student [age=" + age + ", name=" + name + "]";
    }
}

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
        //1. 得到Student類對應(yīng)的 Class對象
        Class<?> stuClass = Class.forName("com.hspedu.reflection.Student");
        //2. 創(chuàng)建對象
        Object o = stuClass.newInstance();//o 的運(yùn)行類型就是Student
        System.out.println(o.getClass());//Student
        //3. 使用反射得到age 屬性對象
        Field age = stuClass.getField("age");
        age.set(o, 88);//通過反射來操作屬性
        System.out.println(o);//
        System.out.println(age.get(o));//返回age屬性的值

        //4. 使用反射操作name 屬性
        Field name = stuClass.getDeclaredField("name");
        //對name 進(jìn)行暴破, 可以操作private 屬性
        name.setAccessible(true);
        //name.set(o, "老韓");
        name.set(null, "老韓~");//因?yàn)閚ame是static屬性,因此 o 也可以寫出null
        System.out.println(o);
        System.out.println(name.get(o)); //獲取屬性值
        System.out.println(name.get(null));//獲取屬性值, 要求name是static
    }

3 訪問方法

class Monster {}
class Boss {//類
    public int age;
    private static String name;

    public Boss() {//構(gòu)造器
    }

    public Monster m1() {
        return new Monster();
    }

    private static String say(int n, String s, char c) {//靜態(tài)方法
        return n + " " + s + " " + c;
    }

    public void hi(String s) {//普通public方法
        System.out.println("hi " + s);
    }
}
 public static void main(String[] args) throws Exception{

        //1. 得到Boss類對應(yīng)的Class對象
        Class<?> bossCls = Class.forName("com.hspedu.reflection.Boss");
        //2. 創(chuàng)建對象
        Object o = bossCls.newInstance();
        //3. 調(diào)用public的hi方法
        //Method hi = bossCls.getMethod("hi", String.class);//OK
        //3.1 得到hi方法對象
        Method hi = bossCls.getDeclaredMethod("hi", String.class);//OK
        //3.2 調(diào)用
        hi.invoke(o, "韓順平教育~");

        //4. 調(diào)用private static 方法
        //4.1 得到 say 方法對象
        Method say = bossCls.getDeclaredMethod("say", int.class, String.class, char.class);
        //4.2 因?yàn)閟ay方法是private, 所以需要暴破,原理和前面講的構(gòu)造器和屬性一樣
        say.setAccessible(true);
        System.out.println(say.invoke(o, 100, "張三", '男'));
        //4.3 因?yàn)閟ay方法是static的,還可以這樣調(diào)用 ,可以傳入null
        System.out.println(say.invoke(null, 200, "李四", '女'));

        //5. 在反射中,如果方法有返回值,統(tǒng)一返回Object , 但是他運(yùn)行類型和方法定義的返回類型一致
        Object reVal = say.invoke(null, 300, "王五", '男');
        System.out.println("reVal 的運(yùn)行類型=" + reVal.getClass());//String


        //在演示一個(gè)返回的案例
        Method m1 = bossCls.getDeclaredMethod("m1");
        Object reVal2 = m1.invoke(o);
        System.out.println("reVal2的運(yùn)行類型=" + reVal2.getClass());//Monster
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容