黑马程序员技术交流社区
标题:
成员变量反射中字节码获取方法的疑问
[打印本页]
作者:
郑文博
时间:
2012-7-22 19:55
标题:
成员变量反射中字节码获取方法的疑问
本帖最后由 郑文博 于 2012-7-22 21:45 编辑
/*
将任意一个对象中的所有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);
}
}
}
}
复制代码
作者:
王飞
时间:
2012-7-22 20:09
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 aa
{
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()呢?-
---因为你要比较的是String这种类型的,而在内存中只有String一份这样的字节码,
//如果你用Object的话,就比较的是Object这种类型的,与你想要比较的类型不符,下面的代码就不会执行,所以就改变不了
字节码对应的实例对象三种获取方法是:类名.class;对象.getClass();Class.forName("类名"),
我个人理解是:可以替换String.class确切应该是String的对象.getClass()-
---String是一个类,所以String.class也是获取字节码的一种形式,是成立的
只是此处没有String的对象,有没有可能用父类Object的对象来做呢?
---如果你用Object类来做的话,用的就是Object这份字节码,field.getType() == String.class这个地方就不会成立,所以下面你就换不成
请提供一个可以替换的一种方法,多谢。
*/
{
String oldValue = (String)field.get(obj);
String newValue = oldValue.replace("b", "v");
field.set(obj, newValue);
}
}
}
}
作者:
rslheima
时间:
2012-7-22 20:57
我也没想出来,不过没有String的对象,你就自己造个呗,
String str="";
在if(field.getType() ==
str.getClass()
)
或者
// if(field.getType() == fields.toString().getClass())
;反正他们都能转换成String类型。呵呵
private static void changeStringValue(Object obj)throws Exception
{
String str="";
Field[] fields = obj.getClass().getFields();
for(Field field : fields)
{
if(field.getType() ==
str.getClass()
)
//
if(field.getType() == ReflectTest.class.toString().getClass())
// if(field.getType() == fields.toString().getClass())
{
String oldValue = (String)field.get(obj);
String newValue = oldValue.replace("b", "v");
field.set(obj, newValue);
}
}
}
作者:
王飞
时间:
2012-7-22 21:50
王飞 发表于 2012-7-22 20:09
import java.lang.reflect.Field;
class ReflectDemo
对,每个类在内存中只有一份字节码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2