关于java'反射机制,获得类的所有方法与字段

来源:互联网 发布:小学生编程比赛 编辑:程序博客网 时间:2024/06/05 10:36

在java的反射机制中,今天在看视频讲解如何获取一个类的所有方法和字段,看完觉得一头雾水,就半懂半不懂的去做实验。可老出错误,感觉没什么错啊。

测试类FieldTest.java

import java.lang.reflect.Field;




public class FieldTest {


public static void main(String[] args) throws Exception {
Helper helper=new Helper();
changeStringValue(helper);
System.out.println(helper);
}
public  static void changeStringValue(Object obj) throws Exception{
// TODO Auto-generated method stub
Field[] fields =obj.getClass().getFields();
for(Field field:fields){
if(field.getType()==String.class){
String str1=(String)field.get(obj);
String str2=str1.replace('f', 'c');
field.set(obj, str2);
}
}
}


}

辅助类 Helper.java

public class Helper {


String test1="onebyone";
String test2="twobytwo";
String test3="threeorthree";

@Override
public String toString() {
return "Helper [test1=" + test1 + ", test2=" + test2 + ", test3="
+ test3 + "]";
}

}

结果:

Helper [test1=onebyone, test2=twobytwo, test3=threeorthree]

结果在编译执行都没问题,可并没有改变辅助类里面String的值,我很郁闷怎么回事,我就debug一下,发现fields.length的值是0,我不是已经查询所有的字段了吗,怎么还回0呢?没有思路了,后来一想发现,你要想访问辅助类里面的字段时,他们的类型一定是public类型的,否则辅助类的字段是不可见的。所以把辅助类里面的String前面加上public局可以了

结果:

Helper [test1=znebyzne, test2=twzbytwz, test3=threezrthree]

其实还有一种解决方法就在获取时强制获取,用方法.getDeclaredFields()进行强制访问,然而这才是你能访问,要想使用一定要设置Field对象可用,方法setAccessible(true);

0 0
原创粉丝点击