黑马程序员技术交流社区
标题:
反射中的set(Object obj,Object value)设置方法不执行
[打印本页]
作者:
秦兰之
时间:
2013-6-16 08:21
标题:
反射中的set(Object obj,Object value)设置方法不执行
本帖最后由 秦兰之 于 2013-6-17 06:07 编辑
ReflectPoint1.java
package cn.itcast.day1;
public class ReflectPoint1 {
public String str1 ="ball";
public String str2 ="basketball";
public String str3 ="itcast";
@Override //@Override验证toString方法是否正确。
public String toString(){
return str1+" : "+str2+" : "+str3+" : ";
}
}
ReflectText1.java
package cn.itcast.day1;
import java.lang.reflect.Field;
public class ReflectTest1 {
public static void main(String[] args)throws Exception {
ReflectPoint pt1=new ReflectPoint(3,5); //自定义一个成员变量的反射对象。
Field fieldY=pt1.getClass().getField("y"); //获取反射对象中类的字段,自定义一个字段对象。
//fieldY的值是多少,是5,错!fieldY不是对象身上的变量,而是类上,要用它去取某个对象上对应的值。
System.out.println(fieldY.get(pt1)); //打印该反射对象中字段对象的值。
Field fieldX=pt1.getClass().getDeclaredField("x"); //getDeclaredField():无论是否可见都要获取该字段。
fieldX.setAccessible(true); //设置访问权限为true.
System.out.println(fieldX.get(pt1));
changeStringvalue(pt1);
System.out.println(pt1);//这句代码没写,所以我以为field.set(obj, newvalue); 没执行。谢谢各位。
}
//将字段中的b替换成a.
private static void changeStringvalue(Object obj) throws Exception {
Field[] fields=obj.getClass().getFields(); //获取字段对象数组
for(Field field : fields){ //遍历字段对象数组
if(field.getType()==String.class){ //判断字段类型地址值是否相等。
String oldvalue=(String)field.get(obj); //获取该字段对象数组的旧值,自定义一个字符串对象存储旧值。抛出异常。
String newvalue=oldvalue.replace('b', 'a'); //使用新值替换旧值,自定义一个字符串对象存储 替换后的新值。
field.set(obj, newvalue); //设置打印字段对象替换后的新值。//这句话怎么不执行?
}
}
}
}
作者:
知行
时间:
2013-6-16 14:16
本帖最后由 知行 于 2013-6-16 14:18 编辑
亲,你的代码贴错了吧 ,怎么代码里用的ReflectPoint 而贴出来的ReflectPoint1,没有ReflectPoint 所以我没有运行 你试一下吧
//将字段中的b替换成a.
private static void changeStringvalue(Object obj) throws Exception {
Field[] fields=obj.getClass().
getDeclaredFields()
; //获取字段对象数组
for(Field field : fields){
field
.setAccessible(true);
//遍历字段对象数组
if(field.getType()==String.class){ //判断字段类型地址值是否相等。
String oldvalue=(String)field.get(obj); //获取该字段对象数组的旧值,自定义一个字符串对象存储旧值。抛出异常。
String newvalue=oldvalue.replace('b', 'a'); //使用新值替换旧值,自定义一个字符串对象存储 替换后的新值。
field.set(obj, newvalue); //设置打印字段对象替换后的新值。//这句话怎么不执行?
}
}
}
作者:
苑永志
时间:
2013-6-16 15:38
楼主,估计你没有贴出ReflectPoint类的代码,只要像楼上那样更改代码应该就可以正常执行了。对Field的操作主要要注意两点:
1. getField(String fieldName):该方法只能够获得类中public类型属性对应的Field对象,否则会报错,而getDeclaredField(String fieldName)可以得到类中各种类型的属性对应的Field实例
2. 对于Field的get(Object obj)方法,如果类中属性是private类型的,调用该方法会抛出IllegalAccessException,这时候可以先对Field对象调用setAccessible(true);(告诉编译器不要进行访问权限的检查)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2