黑马程序员技术交流社区

标题: 学习成员方法的反射时遇到的一个问题?? [打印本页]

作者: 911趣购    时间: 2014-4-2 03:13
标题: 学习成员方法的反射时遇到的一个问题??
本帖最后由 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版本不同导致的吗?


作者: osully    时间: 2014-4-2 07:38
静态函数 只能访问静态成员,所以对象共享的,可以用类名调用

非静态函数,既可以访问静态,也可以访问非静态,必须是对象调用
作者: 松毛    时间: 2014-4-2 07:53
因为main方法是静态的,如果str1没有使用static修饰,你直接在main方法里使用str1时,就会报错。静态方法里只能直接调用静态的全局变量。
作者: 911趣购    时间: 2014-4-2 11:26
松毛 发表于 2014-4-2 07:53
因为main方法是静态的,如果str1没有使用static修饰,你直接在main方法里使用str1时,就会报错。静态方法里 ...

额   这样啊    我明白了   谢谢哦




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