反射就是用定义好的一种方法来获取一个类内部组成的一种方法,能让我们更明确的使用一种类,或者完成一个正常调用完成不了的一些事。
例如这段代码 就可以修改对象X中的private的值。。
Field fieldX=pt1.getClass.getDeclaredField(x);
fieldX.setAccessible(true);
复制代码
还有把一个对象的类中所有的字符串中的一个字母改成另外的字母,只对这个对象有效- import java.lang.reflect.Field;
-
-
- /**
- * 作业:将任意一个对象中的所有String类型的成员变量所对应的
- * 字符串内容中的“b”改成“a”。
- * @author yupengfei
- *
- */
- public class ReflectHomework
- {
- public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException
- {
-
- RefPoint pt1 = new RefPoint(9);
- RefPoint pt2 = new RefPoint(5);
- changeStrValue(pt1);
- System.out.println(pt1);
- //这里试着看别的成员变量的字符串是否被更改
- System.out.println(pt2);
-
- }
-
-
- private static void changeStrValue(Object obj) throws IllegalArgumentException, IllegalAccessException
- {
- Field[] fields = obj.getClass().getFields();
- for(Field field : fields)
- {
- //这里用 == 因为是字节码比较,所以用等号比较好
- if(field.getType() == String.class)
- {
- String strValue = (String)field.get(obj);
- String newValue = strValue.replace('b', 'a');
- field.set(obj, newValue);
- }
-
- }
- }
- }
- class RefPoint
- {
- int x = 3;
- public String str1 = "basic";
- public String str2 = "babyGo!";
- public String str3 = "lalala";
- public RefPoint(int x)
- {
- this.x=x;
- }
- @Override
- //用于分割显示每个字符串
- public String toString()
- {
- return str1 + ":" +str2+":" + str3;
- }
- }
复制代码 |