----------------------
ASP.Net+Android+IOS开发、
.Net培训、期待与您交流! ----------------------
---------------------- 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 fields
public 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培训、期待与您交流! ----------------------