package cn.guoqing.day01;
import java.lang.reflect.*;
public class ReflectTest1 {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
Constructor constructor1=String.class.getConstructor(StringBuffer.class);
String str1=(String) constructor1.newInstance(new StringBuffer("abcde"));
System.out.println(str1.charAt(3));
ReflectPoint pt1=new ReflectPoint(3,4);
Field fieldY=pt1.getClass().getField("y");
// 此时的fieldY的值不是4,因为fieldY不是对象身上的变量,而是类上的(字节码上的变量),要用它去取某个对象上对应的值(通过下面的那行代码)
int valuey=fieldY.getInt(pt1);
System.out.println(valuey);
Field fieldX=pt1.getClass().getDeclaredField("x");//通过getDeclaredFiel()方法获取字段x.(私有的看不见时)
fieldX.setAccessible(true);//因为成员变量x是私有的,所以要把该字段设置成可获取的 (看见了拿不到时)
int valuex=fieldX.getInt(pt1);//获取字段x在pt1对象中的数值。俗称暴力反射。
System.out.println(valuex);
changeStringValus(pt1);//调用字符替换方法
System.out.println(pt1);;//打印对象的相关信息
}
//定义一个功能,将字符串中一个字符用另外的字符替换
private static void changeStringValus(ReflectPoint pt1) throws Exception {
Field[] fields=pt1.getClass().getFields();//获取字节码对象中的字段
// 遍历符合条件的字段,并进行字符的替换
for(Field field:fields){
if(field.getType()==String.class){
String oldvalues=(String)field.get(pt1);//在这里为什么要加上一个类型转换 。 get方法中返回的类型:如果该字段是一个基本类型字段,则在返回前将该值包装在一个对象中,否则照原样返回,这句话是什么意思,求指教
String newvalues=oldvalues.replace('b','a');
field.set(pt1, newvalues);//设置指定对象中的字段的值
}
}
}
}
package cn.guoqing.day01;
public class ReflectPoint {
private int x;
public int y;
public String str2="ball";
public String str3="basseketball";
public String str4="xinlang";
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "ReflectPoint [str2=" + str2 + ", str3=" + str3 + ", str4="
+ str4 + "]";
}
}
|