------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
1、通过反射得到Date类中的getTime方法
Calendar calendar = Calendar.getInstance();
在此建立了一个Calendar(日历)类的对象
<span style="font-size:14px;">Method getTimeMethod = Calendar.class.getMethod("getTime", null);//通过反射的方式得到字节码对象里的方法
System.out.println(getTimeMethod.invoke(calendar, null));;//调用calendar对象的getTime方法</span>
如以上代码所示,我通过反射方式 得到了Calendar类的getTime方法,然后让calendar这个对象去调用,结果,我取到了系统当前时间。至此,引出张孝祥老师在视频中讲的一句很经典的话:反射,其实就是将一个类中的各种成分映射成对应的java类。
2、用反射的方式替换另一个类中类型为字符串的成员的字符
先给出要用来反射的类,我的目的是将字符串成员的值中的字符‘ l’替换成‘ k’
public class ReflectPoint {
private int x;
public int y
//将下面的各个字符冲的l替换成k。方法在ReflectTest3中
public String str1 = "table tenis";
public String str2 = "bubble";
public String str3 = "bboadcaslyt";
//Alt+Shift+S,单击Generate Constructor using Fields。通过这种方法,自动生成构造函数
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
下面的代码就是,我怎样利用反射,取到ReflectPoint中的成员,找到String类型的成员,并将成员的值替换为‘k’
public class ReflectTest3 {
public static void main(String[] args) throws Exception {
ReflectPoint point = new ReflectPoint(7,8);
changeStrValue(point);
}
private static void changeStrValue(Object obj) throws Exception {
Field[] fields = obj.getClass().getFields();//获得所有的字段
//用增强的for循环迭代
for(Field field : fields){
//用==比较字节码,用equals不专业,尽管它是可以的
//筛选出String类型的字节码
if(field.getType()==String.class){
//通过Field类的get方法获得指定对象的String类型成员的值
String oldValue = (String)field.get(obj);
String newValue = oldValue.replace('l','k');//每个成员的值中的‘l’都替换成‘k’
field.set(obj, newValue);//再把新值赋给field
}
}
}
}
/*
* 通过反射方式,获得ArrayList的无参构造函数
*/
Constructor constructor = Class.forName("java.util.ArrayList").getConstructor();
//建立ArrayList的对象
List list = (ArrayList)constructor.newInstance();
System.out.println(list);