java 27 - 4 反射之 通过反射获取成员变量并使用
类Field:
提供有关类或接口的单个字段的信息,以及对它的动态访问权限。
A:获得类的成员变量 数组:
1、getFields(公共类的)
2、getDeclaredFields(所有类型的)
B:获得类的单个成员变量:
1、getField (公共类的)
2、getDeclaredField (所有类型的)
A.1:获得类的公共成员变量:
1 //获取类的字节码文件对象 2 Class c = Class.forName("zl_Relfect_01.Person"); 3 4 //获得该对象的公共成员变量 5 Field[] f = c.getFields(); 6 //遍历 7 for(Field fie : f){ 8 System.out.println(fie); 9 }
A.2:获得类的所有成员变量:
1 //获取类的字节码文件对象 2 Class c = Class.forName("zl_Relfect_01.Person"); 3 //获取该类的所有成员变量 4 Field[] f = c.getDeclaredFields(); 5 for(Field fie : f){ 6 System.out.println(fie); 7 }
B.1:获得单个公共成员变量:
1 //获取类的字节码文件对象 2 Class c = Class.forName("zl_Relfect_01.Person"); 3 //获取单个公共的成员变量 4 Field f = c.getField("address"); 5 System.out.println(f);
B.2:获得单个所有类型的成员变量:
1 //获取类的字节码文件对象 2 Class c = Class.forName("zl_Relfect_01.Person"); 3 // 获取单个成员变量(所有类型) 4 Field f = c.getDeclaredField("name"); 5 System.out.println(f);
通过反射获取成员变量并使用
1 //获取类的字节码文件对象 2 Class c = Class.forName("zl_Relfect_01.Person"); 3 //通过无参构造创建对象 4 Constructor con = c.getConstructor(); 5 Object obj = con.newInstance(); 6 7 8 //获取私有成员变量name,并对它进行赋值 9 //首先获取私有成员变量name 10 Field newname = c.getDeclaredField("name"); 11 //成员变量name是私有的,所以得先取消语言访问检查 public void setAccessible(boolean flag) 12 newname.setAccessible(true); 13 //set(Object obj,Object value):将指定对象变量上此 Field 对象表示的字段设置为指定的新值。 14 //给obj里面的newname赋值为张三 15 newname.set(obj, "张三"); 16 System.out.println(obj);//Person [name=张三, age=0, address=null] 17 18 19 //获取默认类型成员变量age,并对它进行赋值 20 //获取age变量,并赋值 21 Field newage = c.getDeclaredField("age"); 22 //取消语言访问检查 23 newage.setAccessible(true); 24 //给age赋值 25 newage.set(obj, 13); 26 System.out.println(obj); 27 28 29 //获取公共成员变量address,并对它赋值 30 //获取address对象,并赋值 31 Field newaddress = c.getDeclaredField("address"); 32 newaddress.set(obj, "家乡"); 33 System.out.println(obj);
何事都只需坚持..
难?
维熟尔。
LZL的自学历程...只需坚持