java基础--反射(成员变量)
2013-10-09 20:14
549 查看
这里介绍通过反射获取对象的成员变量,以及修改成员变量。
package Reflect.field; public class Point { int y; public int getY() { return y; } public void setY(int y) { this.y = y; } public Point(int y) { super(); this.y = y; } }
package Reflect.field; public class ReflectPoint extends Point { protected int x; // 必须要用public修饰 否则反射取不到 public int y; // 必须要用public修饰 否则反射取不到 public String str1 = "hello"; public String str2 = "world"; public String str3 = "OK"; public ReflectPoint(int x, int y) { super(10); this.x = x; this.y = y; } // 覆盖了此方法,就可以直接System.out.println(new ReflectPoint()); @Override public String toString() { return str1 + ":" + str2 + ":" + str3; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } }
package Reflect.field; import java.lang.reflect.Field; /** * 成员变量的反射 * * @author xiaoyu * */ public class Test { public static void main(String[] args) throws Exception { // 测试通过反射 获取对象的变量 ReflectPoint pt1 = new ReflectPoint(3, 5); Point pt = new Point(99); Field fieldY = pt1.getClass().getField("y"); // 这样只能取得public 修饰的y Field allFieldY = pt.getClass().getDeclaredField("y"); // 这样所有的y,不管是什么修饰符 // fieldY不是对象上的变量,它是类上的。 fieldY.get(pt1) System.out.println(fieldY.get(pt1)); // 5 System.out.println(allFieldY.get(pt)); // 99 Field fieldX = pt1.getClass().getDeclaredField("x"); // 暴力反射 ,不管x 是不是Public // 修饰的,都可以取到(用了getDeclaredField("x"),setAccessible(true)可以不用写了) // fieldX.setAccessible(true); System.out.println(fieldX.get(pt1)); // 3 // 下面测试通过反射改变一个对象的变量的值 changeStringValue(pt1); // 打印出pt1中的String类型的值 System.out.println(pt1); } /** * 该方法可以改变对象obj中String类型的变量 * * @param obj */ public static void changeStringValue(Object obj) throws Exception { Field[] fileds = obj.getClass().getFields(); // 获取obj对象的所以变量 for (Field field : fileds) { // 循环找出是String类型的变量 // 字节码只有一份,所以可以==,而且比equals()方法更好 if (field.getType() == String.class) {// 如果是String类型的,则改变其值 String oldValue = (String) field.get(obj); String newValue = oldValue.replace('o', 'h'); field.set(obj, newValue);// 当然你也可以设置成新的值 ;field.set(obj, "WWW"); } } } }
相关文章推荐
- 黑马程序员--Java基础加强--16.利用反射操作泛型V【通过Constructor反射解析泛型构造方法】【通过Field反射解析泛型成员变量】【个人总结】
- java基础巩固系列(三):成员变量反射的Field类
- 黑马程序员---java基础加强_成员变量的反射
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- 【Java-Reflection】Class以及反射成员变量和方法
- Java反射(四)-Java获取成员变量与构造函数信息
- java反射学习笔记(3)---使用Class来获取方法、成员变量、构造函数信息
- java基础---静态变量,成员变量,局部变量及类的初始化顺序
- Java基础-类的封装,成员变量的访问及隐藏
- 使用java反射操作类的构造函数,成员变量和成员方法
- Java使用反射来获取成员变量泛型信息
- Java反射06 : 成员变量Field学习示例
- Java反射学习-使用反射修改一个类中的所有String类型的成员变量的值
- java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。
- java基础--07成员变量和局部变量
- JAVA基础day05 面向对象思想 成员变量和方法 封装 构造方法和this的使用
- java 成员变量的反射
- 22、Java入门—反射之获取获取成员变量和构造函数的信息
- 【转】Java基础:Java成员变量初始化