基础加强篇之-----反射

来源:互联网 发布:powerdesigner mac版 编辑:程序博客网 时间:2024/06/05 08:04
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

1、通过反射得到String类中的charAt方法

String str1 = "abc";
这边建立了一个字符串的对象

Method methodCharAt = String.class.getMethod("charAt", int.class);//通过反射的方式得到字节码里的方法System.out.println(methodCharAt.invoke(str1, 1));//调用str1的方法并传入参数//如果按照jdk1.4的语法来调用,由于还没有可变参数,因此一个参数要为数组System.out.println(methodCharAt.invoke(str1, new Object[]{2}));/** *  new Object[]{2} 这句话的意思是有一个object类型的数组里面只有一个元素就是2 * */
如以上代码所示,我通过反射的方式,获取了String类中的charAt方法,然后让str1这个对象去调用,结果,我就可以去到索引1代表的字符,至此,要引出一个张孝祥老师在视频中讲的很经典的一句话,反射,其实就是将一个类中的各种成分映射成为对应的java类

2、用反射的方式去替换另一个类中的字符串成员的字符

首先,我这边先给出我要用来反射的类,我的目的是为了将String类型的值中的b换成a

public class ReflectPoint {private int x;public int y;//快捷键生成的构造函数   Alt+Shift+S 然后选择 Constructor using fieldspublic ReflectPoint(int x, int y) {super();this.x = x;this.y = y;}/**  练习 把下面的字符串中有b的通通改成a *   方法在 ReflectTest类中 * */public String str1 = "ball";public String str2 = "basketball";public String str3 = "itcast";}
我是我在学习的代码的基础上简化后的代码,没有提供对私有成员的get 和set方法,因为在本程序中是使用不到的

下面的就是我如何去使用反射,获取到ReflectPoint中的成员,然后找到String类型的成员,然后将成员的值进行替换

import java.lang.reflect.*;import java.util.Arrays;public class ReflectTest {public static void main(String[] args) throws Exception {ReflectPoint pt1 = new ReflectPoint(3, 5);                changStringValue(pt1);//练习变b为a        }                 private static void changStringValue(Object obj) throws Exception {        Field[] fields = obj.getClass().getFields();//得到所有字段        //进行迭代        for(Field field : fields){            //这里是比较字节码用‘==’ 比 ,当然用equals也行但是显得不专业了            //这边的目的是先筛选出String类型的字节码对象            if(field.getType() == String.class){                //通过Field类的get方法获得指定的对象的成员的值                String oldValue = (String)field.get(obj);                              String newValue = oldValue.replace('b', 'a');//对每个进行替换                field.set(obj, newValue);//还要再把新的赋给它            }                        }    }      }


---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------