黑马程序员技术交流社区
标题:
成员变量反射中字节码获取方法的疑问
[打印本页]
作者:
heheka123
时间:
2014-4-3 10:36
标题:
成员变量反射中字节码获取方法的疑问
本帖最后由 heheka123 于 2014-4-3 22:00 编辑
/*
将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的"b"改成"v"。
*/
import java.lang.reflect.Field;
class ReflectDemo
{
public String str1 = "ball";
public String str2 = "basketball";
public String str3 = "itcast";
public String toString()
{
return str1+".."+str2+"..."+str3;
}
}
public class ReflectTest
{
public static void main(String[] args)throws Exception
{
ReflectDemo rd = new ReflectDemo();
changeStringValue(rd);
System.out.println(rd);
}
private static void changeStringValue(Object obj)throws Exception
{
Field[] fields = obj.getClass().getFields();
for(Field field : fields)
{
if(field.getType() == String.class)
/*
上一句,为什么String.class不能换成obj.getClass()呢?
字节码对应的实例对象三种获取方法是:类名.class;对象.getClass();Class.forName("类名"),
我个人理解是:可以替换String.class确切应该是String的对象.getClass()
只是此处没有String的对象,有没有可能用父类Object的对象来做呢?
请提供一个可以替换的一种方法,多谢。
*/
{
String oldValue = (String)field.get(obj);
String newValue = oldValue.replace("b", "v");
field.set(obj, newValue);
}
}
}
}
复制代码
作者:
残梦共飞雪
时间:
2014-4-3 11:18
本帖最后由 残梦共飞雪 于 2014-4-3 11:28 编辑
若要将String.class换成obj.getClass(),
则通过 if(field.getType() == obj.getClass)的就是一个类中的本类字段。
比如你传入ReflectDemo,obj.getClass就是ReflectDemo.class,通过的只能是ReflectDemo类中的ReflectDemo字段,然而下方你强转String肯定失败的啊。
因为需求是操作ReflectDemo中String类型的字段,所以if处只放行String。 <br/>
if(field.getType() == String.getClass)与下方强转直接挂钩,否则会出现异常
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2