Java-反射调用构造函数、公|私方法、修改公|私成员变量

准备一个被反射的Bean

final public class RelectionTest {

    private String name;
    public int age;//准备一个公开的成员变量
    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;
    }
    /**
     * 特意准备一个私有方法
     */
    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.获取指定构造函数并创建对象

        Class rc = Class.forName("com.stu.java.reflection.RelectionTest");
        //1.选定构造函数类型创建对象-------------
        Class[] paramsType = new Class[2];
        paramsType[0] = String.class;
        paramsType[1] = int.class;
        Constructor constructor = rc.getConstructor(paramsType);
        //准备构造参数 值
        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.调用公|私方法

Object objM = rc.newInstance();//注意 是否支持无参构造,否则会抛出 创建实例异常:InstantiationException
        LogUtils.sysPrintln(objM.toString());
//        RelectionTest{name='null', age=0, gender=false, desc='null'}
        //指定参数类型
        Class[] mPt1 = {String.class};
        //获取对应方法
        Method setNameMethod = rc.getMethod("setName",mPt1);
        //呼叫方法
        setNameMethod.invoke(objM,"objM");
        Method setAgeMethod = rc.getMethod("setAge", int.class);//这都直接有代码提示了。。。
        setAgeMethod.invoke(objM,99);
        //获取一个私有方法
        Method setDescMethod = rc.getDeclaredMethod("setDesc", String.class);
        setDescMethod.setAccessible(true);//true 取消java语言检查,flase 反之使用
        setDescMethod.invoke(objM,"反射呼叫 setDesc方法");
        //获取一个私有方法-优化
        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");// 又自动补全了。。。。一直补一直爽
        if(Modifier.isPrivate(nameF.getModifiers())){
            nameF.setAccessible(true);
        }
        //这里应当 根据不同type 来调用对应的赋值方法,这里因为我们知道这个成员类型为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

你可能感兴趣的:(Java-反射调用构造函数、公|私方法、修改公|私成员变量)