Java-反射調(diào)用構(gòu)造函數(shù)、公|私方法、修改公|私成員變量

準(zhǔn)備一個(gè)被反射的Bean

final public class RelectionTest {

    private String name;
    public int age;//準(zhǔn)備一個(gè)公開的成員變量
    private boolean gender;
    private String desc;

    public RelectionTest(){}

    public RelectionTest(String name, int age) {
        this.name = name;
        this.age = age;
    }
···
    public void setName(String name) {
        this.name = name;
    }
    /**
     * 特意準(zhǔn)備一個(gè)私有方法
     */
    private String getDesc() {
        return desc;
    }
    private void setDesc(String desc) {
        this.desc = desc;
    }
    @Override
    public String toString() {
        return "RelectionTest{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                ", desc='" + desc + '\'' +
                '}';
    }

1.獲取指定構(gòu)造函數(shù)并創(chuàng)建對(duì)象

        Class rc = Class.forName("com.stu.java.reflection.RelectionTest");
        //1.選定構(gòu)造函數(shù)類型創(chuàng)建對(duì)象-------------
        Class[] paramsType = new Class[2];
        paramsType[0] = String.class;
        paramsType[1] = int.class;
        Constructor constructor = rc.getConstructor(paramsType);
        //準(zhǔn)備構(gòu)造參數(shù) 值
        Object[] args = new Object[2];
        args[0] = "obj";
        args[1] = 101;
        Object obj = constructor.newInstance(args);
        LogUtils.sysPrintln(obj.toString());
//        RelectionTest{name='obj', age=101, gender=false, desc='null'}

2.調(diào)用公|私方法

Object objM = rc.newInstance();//注意 是否支持無參構(gòu)造,否則會(huì)拋出 創(chuàng)建實(shí)例異常:InstantiationException
        LogUtils.sysPrintln(objM.toString());
//        RelectionTest{name='null', age=0, gender=false, desc='null'}
        //指定參數(shù)類型
        Class[] mPt1 = {String.class};
        //獲取對(duì)應(yīng)方法
        Method setNameMethod = rc.getMethod("setName",mPt1);
        //呼叫方法
        setNameMethod.invoke(objM,"objM");
        Method setAgeMethod = rc.getMethod("setAge", int.class);//這都直接有代碼提示了。。。
        setAgeMethod.invoke(objM,99);
        //獲取一個(gè)私有方法
        Method setDescMethod = rc.getDeclaredMethod("setDesc", String.class);
        setDescMethod.setAccessible(true);//true 取消java語言檢查,flase 反之使用
        setDescMethod.invoke(objM,"反射呼叫 setDesc方法");
        //獲取一個(gè)私有方法-優(yōu)化
        Method getDescMethod = rc.getDeclaredMethod("getDesc");
        if(Modifier.isPrivate(getDescMethod.getModifiers())){
            getDescMethod.setAccessible(true);
        }
        Object desc = getDescMethod.invoke(objM);
        LogUtils.sysPrintln("desc=%s",desc);
        LogUtils.sysPrintln(objM.toString());
//        RelectionTest{name='objM', age=99, gender=false, desc='反射呼叫 setDesc方法'}

3.修改公|私成員變量的值

        Object objF = rc.newInstance();
        Field ageF = rc.getField("age");
        if(ageF.getType()==int.class){
            ageF.setInt(objF,101);
        }
        //同獲取私有方法一樣,如果是私有限制 則不能直接用getField 要用 getDeclareField
        Field nameF = rc.getDeclaredField("name");// 又自動(dòng)補(bǔ)全了。。。。一直補(bǔ)一直爽
        if(Modifier.isPrivate(nameF.getModifiers())){
            nameF.setAccessible(true);
        }
        //這里應(yīng)當(dāng) 根據(jù)不同type 來調(diào)用對(duì)應(yīng)的賦值方法,這里因?yàn)槲覀冎肋@個(gè)成員類型為String.class 所以偷懶省去
        nameF.set(objF,"objF");
        LogUtils.sysPrintln(objF.toString());
//        RelectionTest{name='objF', age=101, gender=false, desc='null'}


END

參考:https://github.com/HarkBen/JavaSE6Tutorial/blob/master/docs/CH16.md

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容