目录
背景
反射说起来还是上学时候刚学java基础的时候写过单测,之后就再也没用过了,全还给老师了。最近在项目里遇到了一个场景,需要对多个类的相同字段进行相同的逻辑处理,而这些类有些已经继承了其他父类了。略一思考,封装一个方法,入参是Objec,通过反射获取相同的字段,进行业务逻辑处理。听起来是个可行方案,然后我就踩坑了,over。
获取属性值
getDeclaredField(String name) | 获取name字段,public和protected和private,不包括父类字段 |
getField(String name) | 获取name字段,public,包括父类字段 |
非常巧,我要获取父类private的字段,怎么搞呢?获取字段之前先调用下面的方法就好了!
getSuperclass() | 获取父类 |
可以拿到属性字段了,下面获取 属性值
setAccessible(true) | 如果属性是private,先设置属性可操作权限 |
get(obj) | 获取属性值 |
设置属性值
setAccessible(true) | 如果属性是private,先设置属性可操作权限 |
set(Object obj, Object value) | obj属性字段,value 要设置的值 |
完整代码
public void getAndSetFieldValue(Object request) {
try {
Class requestClass = request.getClass();
//1. 获取属性值
Field departIdField = null;
//1.1 获取属性字段
try {
departIdField = requestClass.getDeclaredField("departId");
} catch (NoSuchFieldException e) {
departIdField = requestClass.getSuperclass().getDeclaredField("departId");
}
//1.2 获取属性值
departIdField.setAccessible(true);
Object departIdValueObj = departIdField.get(request);
//2. 设置属性值
Field officeCodeListField = null;
//2.1 获取属性字段
try {
officeCodeListField = requestClass.getDeclaredField("officeOrgCodeList");
} catch (Exception e) {
officeCodeListField = requestClass.getSuperclass().getDeclaredField("officeOrgCodeList");
}
//2.3 设置属性值
officeCodeListField.setAccessible(true);
officeCodeListField.set(request, Arrays.asList("123", "456"));
} catch (Exception e) {
// 异常处理
}
}