Java反射(reflect)是开发过程中一种常用的手段,常常被用在处理一些感觉有共性但看起来又好像没法抽象的功能上.在OECP项目开发当中,我们在很多地方用到了反射,其中对实体类进行了分层抽象封装的过程中就有一些使用.本文将以重写equals方法为例,简单介绍一下java反射的应用.
先大体介绍一下我们的实体封装的结构.从UML图中我们可以看到顶级SuperEO类作为整个实体层次的顶端,它包含了所有实体类所共有的方法和属性,比如:克隆方法.我们知道克隆方法的默认实现是Object中的,并且为浅克隆.但浅克隆通常对于我们来说没什么意义,所以我们需要实现一个深克隆的方法(本文主要是说java反射的应用.深克隆和浅克隆的区别不了解的朋友可以去google一下),这个方法为所有实体类所共有.像这样需要所有实体共有的方法还有equals(比较),getAttributeValue(根据字段名得到字段值)等等.SuperEO下有两个分支,分别为BaseEO和BaseVO.BaseEO为可持久化实体的父类,包括跟持久化有关的一些属性和方法.BaseVO为非持久化实体父类,此类暂时没有自己的方法和属性,其存在的目的是预留有备扩充.由此,系统中所有的实体类都从这两个分支派生而来.下面几个类就不详细介绍了,毕竟此文的目的不是介绍实体抽象方案的.以后我们在其他地方再对这个实体结构做详细分析说明.
我们看到在实体继承关系之外,存在一个叫做EOUtility的类,此类是个EO的辅助工具类,SuperEO依赖这个工具类,来实现一些通用方法.我们所要说的java反射的应用,也就集中在这个工具类中.
这个类中,我们使用java反射实现了好多通用的功能.在这里我就不每个方法都说明了,只简单介绍其中一个来说一下java反射的用法吧.equals方法是我们java开发人员平时比较常用的一个方法,用来比较两个对象是否相等.此方法的默认实现为Object类中的实现,而默认实现的原理呢,则是按内存地址进行比较,也就是说,如果我们创建了两个内部值完全相同的对象,在我们使用equals对它们进行比较时返回的结果会是false,因为他们的内存地址是不同的.显然这不是我们想要的结果,我们需要的是,将两个对象的内部属性值进行逐一对比,全部相同则返回true,否则为false.为了实现这个目的,我们应该怎么去做呢?下面我们分析一下.
为了使所有的子类都拥有这个方法,我们必须将这个方法定义在顶级超类SuperEO中.在两个对象进行比较时,我们需要获取对象中所有的属性字段,以及这些字段的get方法,而后使用get方法得到属性值,对这些