黑马程序员技术交流社区
标题:
反射修改字段的问题
[打印本页]
作者:
高阳
时间:
2013-1-10 16:12
标题:
反射修改字段的问题
/*题目:把Person中属性是字符串的内容中啊字符'h'换成'x'
* 已经创建Person类,属性全部私有
* private int age;
private String name;
private String name2;
构造器全部私有
重写了toString方法
*/
public static void main(String[] args) throws Exception {
//获取Person类的字节码文件
Class obj=Class.forName("Persosn");
//我想通过构造器直接赋值,所以需要获取他的构造器对象
Constructor con=obj.getConstructor(int.class,String.class,String.class);
//由于构造器是私有的,所以需要暴力访问
con.setAccessible(true);
//通过构造器给对象赋值
Person p=(Person)con.newInstance(12,"haha","hehe");
Field[]field=obj.getDeclaredFields();
//遍历所有字段
for(Field fie:field){
//字段全是私有,所以需要暴力访问
fie.setAccessible(true);
if(fie.getType()==String.class){
String s1=(String)fie.get(obj);
String s2=s1.replace("h","x");
fie.set(obj,s2);
}
}
System.out.println(p);
}
会出异常,为什么啊,哪里错了
作者:
高阳
时间:
2013-1-10 16:32
解决了,太不小心了,还有对反射的概念太模糊了
/*题目:把Person中属性是字符串的内容中字符'h'换成'x'
* 已经创建Person类,属性全部私有
* private int age;
private String name;
private String name2;
构造器全部私有
重写了toString方法
*/
public static void main(String[] args) throws Exception {
//获取Person类的字节码文件
Class obj=Class.forName("fanshe.Person");
//我想通过构造器直接赋值,所以需要获取他的构造器对象
Constructor con=obj.getDeclaredConstructor(int.class,String.class,String.class);
//由于构造器是私有的,所以需要暴力访问
con.setAccessible(true);
//通过构造器给对象赋值
Person p=(Person)con.newInstance(12,"haha","hehe");
Field[]field=obj.getDeclaredFields();
//遍历所有字段
for(Field fie:field){
//字段全是私有,所以需要暴力访问
fie.setAccessible(true);
if(fie.getType()==String.class){
String s1=(String)fie.get(p);
String s2=s1.replace("h","x");
fie.set(p,s2);
}
}
System.out.println(p);
}
作者:
黄锦成
时间:
2013-1-10 16:40
本帖最后由 黄锦成 于 2013-1-10 16:49 编辑
public static void main(String[] args) throws Exception {
//获取Person类的字节码文件
Class obj=Class.forName("Person");
//我想通过构造器直接赋值,所以需要获取他的构造器对象
Constructor con=obj.getConstructor(int.class,String.class,String.class);
//由于构造器是私有的,所以需要暴力访问
con.setAccessible(true);
//通过构造器给对象赋值
Person p=(Person)con.newInstance(12,"haha","hehe");
Field[]field=obj.getDeclaredFields();
//遍历所有字段
for(Field fie:field){
//字段全是私有,所以需要暴力访问
if(fie.getType()==String.class){
fie.setAccessible(true);
String s1=(String)fie.get(
p
);
String s2=s1.replace("h","x");
fie.set(
p
,s2);
}
}
作者:
黄锦成
时间:
2013-1-10 16:51
高阳 发表于 2013-1-10 16:32
解决了,太不小心了,还有对反射的概念太模糊了
/*题目:把Person中属性是字符串的内容中字符'h'换成'x'
* ...
把fie.setAccessible(true);放在if语句里面,因为只对是String类型的进行暴力访问,你写在外面,也对int类型变量有作用
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2