package cn.itcast.heima;
import java.lang.reflect.Field;
/*
* 将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的“b”改成“a”
* 例如:ball-->aall,
*/
public class ChangeString {
/**
* @param args
*/
public static void main(String[] args) {
//创建一个StringValue的实例化对象
StringValue stv = new StringValue("ball","basketball","back");
//在调用ChangeStringValue()时,对该方法抛出的异常进行处理
try {
ChangeStringValue(stv);
} catch (Exception e) {
// 输出异常信息
e.printStackTrace();
}
/*
* 输出:
* StringValue [str1=aall, str2=aasketaall, str3=aack]
*/
System.out.println(stv);
}
private static void ChangeStringValue(Object obj) throws Exception {
/*
* 获得Class对象,调用Class对象的getDeclaredFields()方法,
* 返回此Class对象所表示的类的指定属性(Field),与属性的访问级别无关。
*/
/*
* 如果这样写:Field[] fields = obj.getClass().getFields();
* 则输出 :StringValue [str1=aall, str2=basketball, str3=back]
* 只改变了用public修饰的StringValue,
*/
Field[] fields = obj.getClass().getDeclaredFields();
//遍历所有的字段信息
for(Field field :fields){
/*
* if(field.getType().equals(String.class));
* 用equals在此比较其语意不明确
* 比较字节码要用等号比
*/
if(field.getType() == String.class){
//设置可以访问私有变量的权限
field.setAccessible(true);
//获取原来存放的StringValue
String oldValue = (String) field.get(obj);
/*
* replace(char oldChar, char newChar) -->newString
* 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
*/
String newValue = oldValue.replace('b', 'a');
/*
* set(Object obj, Object value)
* 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
*/
field.set(obj, newValue);
}
}
}
}
package cn.itcast.heima;
public class StringValue {
//定义三个String变量
public String str1 ;
private String str2;
private String str3;
/*
* 写一个StringValue的构造方法,传入三个String变量
*/
public StringValue(String str1, String str2, String str3) {
super();
this.str1 = str1;
this.str2 = str2;
this.str3 = str3;
}
/*
*重写toString()方法
* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "StringValue [str1=" + str1 + ", str2=" + str2 + ", str3="
+ str3 + "]";
}
}
|