反射笔记二

通过相应的api 获取成员变量并且修改相应的值
Field 和Field[] 专门用来保存成员变量数组和成员变量
我也不知道这个东西什么时候会用到,但是我觉得一定会有用的。

测试类
public class DemoTwo {
    int i;
    public float f;
    protected  boolean b;
    private  String s;
}

具体实现:
public class TestMain {
    public static void main (String[] args){
        DemoTwo demoTwo=new DemoTwo();
        Class twoClass=demoTwo.getClass();
        Field[] declaredFileds=twoClass.getDeclaredFields();
        for(int i=0;i<declaredFileds.length;i++){
            Field field=declaredFileds[i];
            System.out.println("名称为:"+field.getName());
            Class fileType=field.getType();
            System.out.println("类型为:"+fileType);
            boolean isTurn=true;
            while(isTurn){
                try{
                    isTurn=false;
                    System.out.println("修改前的值为:"+field.get(demoTwo));
                    if(fileType.equals(int.class)){
                        System.out.println("利用方法setInt()修改成员变量的值");
                        field.setInt(demoTwo,777);
                    }else if(fileType.equals(float.class)){
                        System.out.println("利用方法setFloat()修改成员变量");
                        field.setFloat(demoTwo,2017.01f);

                    }else if(fileType.equals(boolean.class)){
                        System.out.println("利用方法setBoolean()修改成员变量");
                        field.setBoolean(demoTwo,true);

                    }else{
                        System.out.println("利用方法set()修改成员变量");
                        field.set(demoTwo,"MWQ");

                    }
                    System.out.println("修改后的值"+field.get(demoTwo));
                }catch (Exception e){
                    System.out.println(e.getMessage());
                    field.setAccessible(true);
                    isTurn=true;
                }
            }
            System.out.println();
        }
    }
}
运行结果:
名称为:i
类型为:int
修改前的值为:0
利用方法setInt()修改成员变量的值
修改后的值777

名称为:f
类型为:float
修改前的值为:0.0
利用方法setFloat()修改成员变量
修改后的值2017.01

名称为:b
类型为:boolean
修改前的值为:false
利用方法setBoolean()修改成员变量
修改后的值true

名称为:s
类型为:class java.lang.String
class refelect_demo.TestMain cannot access a member of class refelect_demo.DemoTwo with modifiers "private"
修改前的值为:null
利用方法set()修改成员变量
修改后的值MWQ

getName()  获得成员变量名称
getType() 获得成员变量类型 Class对象
get(Object obj) 获得指定对象obj中成员变量的值,返回为Object类型
set(Object obj,Object value) 将指定的obj中成员变量的值设置为value;
getInt(Object obj) 获得指定对象obj中类型为int的成员变量的值;
setAccessible(boolean flag) 设置这个方法可以直接忽略权限直接访问private等私有权限的成员变量 





猜你喜欢

转载自blog.csdn.net/weixin_38121659/article/details/78726399