黑马程序员技术交流社区

标题: 用反射改变变量值时,变量用private修饰时怎么改? [打印本页]

作者: 李建雄    时间: 2011-10-30 13:50
标题: 用反射改变变量值时,变量用private修饰时怎么改?
下面这个程序是把ReflectPoint对象里的String类型的变量的值中的a替换成b,为什什么只有public的能改

private 或 没有修饰的怎么改?

public class ReflectTest {

                public static void main(String[] args) throws Exception {
                ReflectPoint rfp=new ReflectPoint(5,8);

                               
                replace(rfp);
               
                Field rfpA=rfp.getClass().getDeclaredField("a");
                rfpA.setAccessible(true);
                System.out.println(rfpA.get(rfp));
                //System.out.println(rfp.a);
               
                System.out.println(rfp.b);
                System.out.println(rfp.c);
        }

        private static void replace(Object rfp) throws Exception {
                Field[] fields=rfp.getClass().getFields();
                for(Field field: fields){
                        if(field.getType()==String.class){
                                String strValue=(String)(field.get(rfp));
                                String newStr=strValue.replace('b', 'a');
                               
                                field.set(rfp, newStr);
                        }
                }
               
        }

}


public class ReflectPoint {
        private int x;
        public int y;
        private String a="ball";              //改变后要成:"aall"
        public String b="basketball";     //改变后:"aasketaall"
                String c="I like sb";
       
        public ReflectPoint(int x,int y){
                this.x=x;
                this.y=y;
        }
       
}
作者: 吉许    时间: 2011-10-30 14:00
举一个例子来说明吧:
class DemoTest{
   private String name="张三";
   public getName(){
       system.out.println("public getName " + name);
       return name;
   }
   private getName2(){
       system.out.println("private getName2 " + name);
      return name;
   }
}

1.先得到field,
Field field=clazz.getDeclaredField("name");
2.将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
field.setAccessible(true);
3.对变量值进行修改
field.set("name","王五");

要访问私有方法是同样,
Method method=clazz.getDeclaredMethod("getName2");
method.setAccessible(true);
method.invoke(test,new Object[]{"王五"});


作者: 贺洪京    时间: 2011-10-30 14:38
你可以强暴一下,比如:
class person{
  pirvate String name;
  private int age;
   public person(String name,String age){
   this.name=name;
   this.age=age;
      }
public void pint(){
   System.out.println(name+":"+age);
}
}
public class ReflectPerson{
   public static void main(String agrs[]){
  Person p=new Person("张三",12);
   Class clazz=person.class;
       Field field=clazz.getDeclaredField("name");
          field.setAccessible(true);
                field.set(p,"l李四");                .
}
}
如果要访问私有的成员变量name的话就需要强暴一下就行了field.setAccessible(true);对了别忘了在得到私有字段的时候一定要用getDeclaredField方法啊

作者: 李建雄    时间: 2011-10-30 22:46
吉许 发表于 2011-10-30 14:00
举一个例子来说明吧:
class DemoTest{
   private String name="张三";

谢谢!解决了,,加了getDeclaredField()  和setAccessible()  
作者: 李建雄    时间: 2011-10-30 22:48
贺洪京 发表于 2011-10-30 14:38
你可以强暴一下,比如:
class person{
  pirvate String name;

谢谢,! '强暴',这词有意思,不知是哪个起的名?

还真是要强暴一下!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2