通过相应的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等私有权限的成员变量