本人写一个excel导出工具类的时候运用到java的反射,根据属性名获取属性值。 最简单的代码:
try {
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
//设置对象的访问权限,保证对private的属性的访问
Object v = field.get(object);
if (v == null){
return "";
}
return String.valueOf(field.get(object));
} catch (Exception e) {
return null;
}
1 问题1:获取不到父类的属性值; 上面的代码只是对当前对象的获取,object.getClass()
,根本获取不到父类的属性,object.getSuperclass()
,是获取上级对象,所以想到了循环获取。并且判断一定要是objec对象
Field field = null;
Class<?> c = object.getClass();
while (c != Object.class){
try {
field = c.getDeclaredField(s);
}catch (Exception e){
}
c = c.getSuperclass();
}
假如子类和父类都有此属性名,那么父类的会覆盖子类的。
问题2.获取不到属性类型为对象中的属性。
如:
public class po1 extends BasePo {
private po2 po2;
}
思路:首先获取po2的值->在获取po2对象里的值,那么这样就简单,还是用到了循环。
// object:一个对象(如:po1)。fieldName:字段名(如:po2.name)
public static String getFieldValueByFieldName(String fieldName, Object object) {
//分割字段名
List<String> ss = new ArrayList<>();
if (StringUtils.isNotBlank(fieldName)){
ss = Arrays.stream(fieldName.split(".")).collect(Collectors.toList());
}
String val = "";
// 循环字段名(获取第一个字段名的属性值,赋值给object 在获取第二个字段名的属性 以此类推 直到结束)
for (String s :ss){
try {
Field field = null;
Class<?> c = object.getClass();
while (c != Object.class){
try {
field = c.getDeclaredField(s);
}catch (Exception e){
}
c = c.getSuperclass();
}
if (field != null){
field.setAccessible(true);
//设置对象的访问权限,保证对private的属性的访问
Object v = field.get(object);
if (v == null){
return "";
}
// 赋值给对象(准备第二次循环)
object = v;
// 获取对象属性的值(如果没有下一个字段名,那么这就是最终值)
val = String.valueOf(object);
}else {
return "";
}
} catch (Exception e) {
return null;
}
}
return val;
}
以上就是我在开发时碰到的一些问题以及解决方案!