通过反射获取和设置对象私有字段的值?
2017-05-14 17:24
441 查看
可以通过类对象的getDeclaredField()方法字段(Field)对象,然后再通过字段对象的setAccessible(true)将其设置为可以访问,接下来就可以通过get/set方法来获取/设置字段的值了。下面的代码实现了一个反射的工具类,其中的两个静态方法分别用于获取和设置私有字段的值,字段可以是基本类型也可以是对象类型且支持多级对象操作,例如ReflectionUtil.get(dog, "owner.car.engine.id");可以获得dog对象的主人的汽车的引擎的ID号。 import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; /** * 反射工具类 * @author 骆昊 * */ public class ReflectionUtil { private ReflectionUtil() { throw new AssertionError(); } /** * 通过反射取对象指定字段(属性)的值 * @param target 目标对象 * @param fieldName 字段的名字 * @throws 如果取不到对象指定字段的值则抛出异常 * @return 字段的值 */ public static Object getValue(Object target, String fieldName) { Class<?> clazz = target.getClass(); String[] fs = fieldName.split("\\."); try { for(int i = 0; i < fs.length - 1; i++) { Field f = clazz.getDeclaredField(fs[i]); f.setAccessible(true); target = f.get(target); clazz = target.getClass(); } Field f = clazz.getDeclaredField(fs[fs.length - 1]); f.setAccessible(true); return f.get(target); } catch (Exception e) { throw new RuntimeException(e); } } /** * 通过反射给对象的指定字段赋值 * @param target 目标对象 * @param fieldName 字段的名称 * @param value 值 */ public static void setValue(Object target, String fieldName, Object value) { Class<?> clazz = target.getClass(); String[] fs = fieldName.split("\\."); try { for(int i = 0; i < fs.length - 1; i++) { Field f = clazz.getDeclaredField(fs[i]); f.setAccessible(true); Object val = f.get(target); if(val == null) { Constructor<?> c = f.getType().getDeclaredConstructor(); c.setAccessible(true); val = c.newInstance(); f.set(target, val); } target = val; clazz = target.getClass(); } Field f = clazz.getDeclaredField(fs[fs.length - 1]); f.setAccessible(true); f.set(target, value); } catch (Exception e) { throw new RuntimeException(e); } } } --------------------------通过反射调用对象的方法?--------------------------
import java.lang.reflect.Method; class MethodInvokeTest { public static void main(String[] args) throws Exception { String str = "hello"; Method m = str.getClass().getMethod("toUpperCase"); System.out.println(m.invoke(str)); // HELLO } }
相关文章推荐
- Java - 如何通过反射获取和设置对象私有字段的值?
- 如何通过反射获取和设置对象私有字段的值?
- 通过java反射获取任意对象的字段名及字段值
- Java通过反射获取和设置对象的属性值
- 通过反射获取对象属性、属性的值,设置对象属性的值
- 通过java反射获取任意对象的字段名及字段值
- 【反射】通过反射(包括父对象)获取指定字段的值
- C#通过反射获取对象属性,打印所有字段属性的值
- java中反射机制通过字节码文件对象获取字段和函数的方法
- 通过java反射获取任意对象的字段名及字段值
- C#反射新建类实例和调用类方法及属性帮助类 以及获取或设置对象属性中字段值帮助类
- 反射机制的概述和字节码对象的获取,通过反射获取构造方法并使用;通过反射获取成员变量并使用;通过反射获取私有成员变量并使用;通过反射获取成员方法并使用
- java通过反射设置对象私有属性
- 反射第五步 : 通过反射获取某一个类的字段值,并设置字段值 (很少用)
- java中反射机制通过字节码文件对象获取字段和函数的方法
- 通过java反射获取任意对象的字段名及字段值
- 通过java反射获取对象的字段名和字段值
- 通过java反射获取任意对象的字段名及字段值
- 反射可以通过FieldInfo.SetValue设置任何字段的值。
- java反射动态获取字段名并设置字段值