记一次java反射的问题!

本人写一个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;
    }

以上就是我在开发时碰到的一些问题以及解决方案!

转载于:https://my.oschina.net/u/4037000/blog/3083768

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值