本帖最后由 911趣购 于 2014-4-2 11:27 编辑
package Test2;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/*
* 需求:
* 将任意一个对象中的所有String类型的成员变量中的所对应的字符串中的'b'改变成'a'
*/
public class ReflectPactice {
//定义三个成员变量
public static String str1="ball";
public String str2="basketball";
public String str3="itcast";
//覆盖toString()方法是为了能够看到更好的效果
@Override
public String toString() {
return str1+"---"+str2+"---"+str3;
}
public static void main(String[] args)throws Exception {
ReflectPactice rp=new ReflectPactice();
changeStringField(rp);//调用changeStringField()方法
System.out.println(rp);
/*
* 成员方法的反射
*/
Method methodChartAt=String.class.getMethod("charAt", int.class);
/*
* 如果给invoke()方法传递的一个参数为null,那么method的方法就要使用静态的方法
* invoke表示调用methodChartAt,输出a
*/
System.out.println(methodChartAt.invoke(str1,1));
}
private static void changeStringField(Object obj)throws Exception {
Field[] fields=obj.getClass().getFields();//得到所有的字段
for(Field field: fields)//对字段进行迭代
{
/*
* field.getType()得到字段的类型,对字节码的比较要用==比较,用equals也可以
*/
//if(field.getType().equals(String.class)){
if(field.getType()==String.class)
{
String oldValue=(String)field.get(obj);//获得字段的值
String newValue=oldValue.replace('b', 'a');//将b字符替换成a
field.set(obj, newValue);//设置新的字符
}
}
}
}
System.out.println(methodChartAt.invoke(str1,1));这里如果我的成员方法不是定义成静态的 就会报错,就提示我要改变成静态的
public String str1="ball";//这样会报错
public static Stiring str1="ball";//这样就不报错了,这是为什么呢?是JDK版本的不同吗 还是。。。。。
这个问题是JDK版本不同导致的吗?
|