黑马程序员技术交流社区
标题:
利用反射修改自定对象的属性值
[打印本页]
作者:
黑马-小龙
时间:
2013-3-4 03:53
标题:
利用反射修改自定对象的属性值
import java.lang.reflect.Field;
public class ReflectDemo1 {
/**
*
* 将任意对象中的String类型的成员变量所对应的字符串内容中的"b"改成"a"
*/
public static void main(String[] args) {
ReflectDemo2 obj = new ReflectDemo2();
try {
changeString(obj);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(obj);
}
public static void changeString(Object obj) throws Exception {
// 获取该对象的字节码文件
Class c1 = obj.getClass();
// 通过字节码文件获取它的public属性
Field[] f1 = c1.getFields();
// 遍历所有的属性
for (Field field : f1) {
// 判断如果所有属性的字节码和String的字节码相同
if (field.getType() == String.class) {// 用等号,因为用的是同一个字节码文件
// 获取该属性的值
String val = (String) field.get(obj);
// 替换值的字节
String val2 = val.replace('b', 'a');
// 设置新的值
field.set(obj, val2);
}
}
}
}
请问,如果我自定义类的属性是private修饰,这样写还可以吗?或者说必须暴力反射?
作者:
谢达
时间:
2013-3-4 08:33
如果自定义类的属性是private修饰的,必须用到暴力反射才能对私有成员进行操作,下面实例
package com.ccsu.xie;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class ReflectTest {
public static void main(String[] args) throws Exception{
//获取ReflectDemo上带String类型参数的构造函数对象
Constructor con = ReflectDemo.class.getDeclaredConstructor(String.class);
//因为构造函数私有,将accessible标识值设为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
con.setAccessible(true);
ReflectDemo rd = (ReflectDemo) con.newInstance("reflect");
System.out.println(rd.getName()); //reflect
//获取name属性
Field field = ReflectDemo.class.getDeclaredField("name");
//name属性是私有的,所以将accessible标识值设为 true
field.setAccessible(true);
field.set(rd, "zhangsan");
System.out.println(rd.getName()); //zhangsan
}
}
class ReflectDemo {
private String name;
private ReflectDemo(String name){
this.name = name;
}
public String getName(){
return name;
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2