如何通过反射获取和设置对象私有字段的值?

摘要:
可以使用类对象的getDeclaredField()方法将字段对象设置为可访问,然后使用字段对象的setAccessible方法获取/设置字段的值。导入java.lang.reflect。施工单位;导入java.lang.reflect。领域导入java.lang.reflect。改性剂;导入java.util。阵列列表;导入java.util。列表;/***反射工具类*@作者罗浩**/publicclassReflectionUtil{privateReflectionUsil(){thrownewAssertionError();}/***通过反射获取对象的指定字段(属性)的值*@paramtarget目标对象*@paramfieldName字段名称*@throws如果无法获取对象的特定字段的值,引发异常*/publicstaticObjectgetValue{Classclazz=target.getClass();String[]fs=fieldName.split;尝试{Fieldf=clazz.getDeclaredField;f.setAccessible;target=f.get;clazz=target.getClass);}Fieldf=clazz。getDeclaredField;f、 setAccessible;返回。获取;}catch{thrownewRuntimeException;}}/***为反映到对象*@paramtarget目标对象*@pparamfieldName的指定字段分配一个值字段的名称*@paramvalue值*/publicstaticvoidsetValue{Class˂?

可以通过类对象的 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);

}

}

}

免责声明:文章转载自《如何通过反射获取和设置对象私有字段的值?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇App随机测试之Monkey和MaximAngular路由(一):路由的定义、跳转、传值下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

1-多线程与多进程

  一 进程与线程的概念 1.1 进程 考虑一个场景:浏览器,网易云音乐以及notepad++ 三个软件只能顺序执行是怎样一种场景呢?假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源。你是不是已经想到在程序A读取数据的过程中,让程序B去...

xcode

xcode 10 上pod install 出现错误 error: /Users/apple/Desktop/VenusClient/Pods/Pods/Target Support Files/Pods-VenusMaster/Pods-VenusMaster.debug.xcconfig: unable to open file (in target...

Android签名总结

http://www.cnblogs.com/wanqieddy/p/3556060.html signapk.jar与eclipse export插件默认赋予程序一个DEBUG权限的签名 signapk.jar包含有系统权限(system api, permission),而eclipse export插件默认赋予程序一个DEBUG权限的签名。 D:...

Android上GDB的使用

转自:blog.163.com/bjtornado@yeah/blog/static/69510484201081181657449/ 1) 编译包含Debug 信息设置如下环境变量:TARGET_BUILD_TYPE=debugTARGET_STRIP_MODULE=false (发现即使设置编译为Debug模式, 最后生成的文件系统中的程序和库还是会被...

Java 面向切面编程(Aspect Oriented Programming,AOP)

本文内容 实例 引入 原始方法 装饰者模式 JDK 动态代理和 cglib 代理 直接使用 AOP 框架——AspectWerkz 最近跳槽了,新公司使用了 AOP 相关的技术,于是查点资料,复习一下。之前,多少知道点,但没怎么在实际项目中使用过~ 下载 demo 实例 引入 package com.cap.aop;   publi...

a标签 target="_blank" 需要注意这些

网页里的 a 标签默认在当前窗口跳转链接地址,如果需要在新窗口打开,需要给 a 标签添加一个 target="_blank" 属性。 <a href="http://www.baidu.com"target="_blank">去百度</a> 安全隐患 如果只是加上 target="_blank" ,打开新窗口后,新页面能通过 win...