黑马程序员技术交流社区
标题:
反射中获得成员变量的值
[打印本页]
作者:
张敬培
时间:
2013-1-7 23:00
标题:
反射中获得成员变量的值
import java.lang.reflect.Field;
//利用反射把字符串中的a替换成b
public class FrflectFieldDemo {
public static void main(String[] args) throws Exception{
ReflectTest rt = new ReflectTest();
Field[] fields = rt.getClass().getFields();
for(Field field: fields){
if(field.getType() == String.class){
String oldStr = (String)field.get(rt);
//String oldStr = (String)field.get(field);//使用field报错
String newStr = oldStr.replace('a', 'b');
System.out.println(newStr);
}
}
}
}
class ReflectTest {
public String str1 = "football";
public String str2 = "pingpangball";
public String str3 = "haha";
public ReflectTest(){}
public String toString(){
return str1+":"+str2+":"+str2;
}
}
复制代码
为什么在获取oldStr时,传入tr能成功,传入field报错
作者:
肖志锋
时间:
2013-1-7 23:25
你可以去查下API,这是Field类的一个方法,public Object get(Object obj) throws IllegalArgumentException,IllegalAccessException,获得参数对象在这个字段的值,如果是基本数据类型,则包装在一个对象里面,所以你那里错了。而且你见过哪个对象有方法是把自己作为参数的吗?
作者:
黄锦成
时间:
2013-1-7 23:52
睡觉之前帮你解决一下吧
String oldStr = (String)field.get(rt); field是属性,field.get(rt)指的是:你要取得field属性的值,肯定要有对象先存在才能取,那么对象就是rt。get方法传入的是根据field属性所属的字节码new出来的。我一开始学这个,还有Method中的invoke方法,是觉得挺别扭的,但是明白了面向对象设计思想之后,就能明白sun为什么会设计成这样子
作者:
ying
时间:
2013-1-8 00:22
本帖最后由 ying 于 2013-1-8 00:32 编辑
<P>package Test;
import java.lang.reflect.Field;
//利用反射把字符串中的a替换成b
public class FrflectFieldDemo {</P>
<P> public static void main(String[] args) throws Exception {
ReflectTest rt = new ReflectTest();
Field[] fields = rt.getClass().getFields();</P>
<P> for (Field field : fields) {
if (field.getType() == String.class) {
String oldStr = (String) field.get(rt);
String newSctr = oldStr.replace('a', 'b');
System.out.println(newSctr);
}
}
System.out.println("==========================================");
//获取对象
ReflectTest t = new ReflectTest();
change(t);
}
public static void change(Object obj) throws Exception
{
//获取要操作的类的Class对象
Class<?> classType = obj.getClass();
//获取对象中的多有成员变量
Field[] fields = classType.getFields();
//操作成员变量
for (int i = 0; i < fields.length; i++) {
//获取第i个成员变量对象
Field field = classType.getDeclaredField(fields[i].getName());
//获取对象对应的值
String fieldValue = field.get(obj).toString();
System.out.println("oldFiledValue: " + fieldValue);
//压制JVM对字段修饰符的检查
field.setAccessible(false);
//替换字段中的“a”为“b”
String changeValue = fieldValue.replace("a", "b");
System.out.println("newFieldValue: " + changeValue);
}
}
}</P>
<P>class ReflectTest {
public String str1 = "football";
public String str2 = "pingpangball";
public String str3 = "haha";</P>
<P> public ReflectTest() {
}</P>
<P> public String toString() {
return str1 + ":" + str2 + ":" + str2;
}
}</P>
复制代码
你只是获取字段对象的值并做替换,你并没有把替换的结果重新赋值给对象
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2