注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一线天色 天宇星辰

天下武功,唯快不破

 
 
 

日志

 
 

面向接口编程与面向数据编程(解密反射无法获取父类属性值)  

2011-03-26 21:59:57|  分类: 软件开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

近日一个同事做一个提现报表的统计功能,需要导出为Excel,但是业务系统中有很多账户需要提现(如现金账户,佣金账户,返利账户,红包账户,积分账户……),由于这几个账户有共同的部分,又有各自不同的特性字段,因此我设计了一个公共的BaseAccountPojo,其他的账户(如CashAccount)继承BaseAccount,这样代码得到了很好的公用,又由于系统中很多地方需要导出Excel,因此我定义了一个public static void exportExcelObject obj的方法,交给我一位组员开发l

代码完成后,测试的时候那位组员惊奇的告诉我这样是不行的,他说想利用反射的机制,但是反射取不到继承的BaseAccount的属性值。

我断点调试,果然发现是这样子的,父类的一些信息全部为null

不可能啊?继承可以得到父类所有的先关信息的,怎么可能拿不到值?

于是,我开始仔细查看他的源代码:

    Field[] fields=object.getClass().getDeclaredFields();

       for(Field field:fields){

           Object objValue = BeanUtils.getProperty(object, field.getName());

           ……

       }

于是,结果不足为奇了,他是通过反射获取Field,然后通过Apachebeanutils获取属性值,这样当然拿不到对应的属性了,因为对于每个类来说,属性肯定都是私有的,既然是私有的,你怎么有权限访问呢?

问题找到了,但是怎么解决呢?

我们平时是怎么解决的呢?对于元数据的Pojo来说,除了属性值外,还有什么?get set方法,对,get set方法。你有没有注意这些方法都是共有的呢?

Java问世以来,大家都在强调面向对象,都在强调封装,于是,我们采用了get set方法,用于外界来访问和改变类内部的属性值,不建议使用对象直接访问属性值(其实私有的对象根本是无法访问的)。

为什么要这么做呢?其实就是在强调一点,就是面向对象(OO),推荐使用方法存取数据(表面上看去就像是调用接口一样),而不推荐直接访问数据(面向数据)。看到这里,我们就很清楚下面该怎么做?采用方法直接取值,于是修正后的代码:

Method[] methods = object.getClass().getMethods();

       for(Method method : methods){

           Object objValue = method.invoke(object);

           ……

       }

OK,再测试,数据完整拿到了!
  评论这张
 
阅读(92281)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017