解决实体类噩梦:联合实体类资料_第1页
解决实体类噩梦:联合实体类资料_第2页
解决实体类噩梦:联合实体类资料_第3页
免费预览已结束,剩余3页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、解决实体类噩梦:联合实体类 Java反射+泛型实际应用)小菜提到的实体类,即 项目中业务或者数据库表的映射,貌似也可以称为模型,不同的语言中叫法不同 吧!举个例子,比如在某个 Web页面中,表单上有大量的数据需要提交,如果是初学 者,很可能这样接收参数:Stri ng param1;Stri ng param2;Stri ng param3;这样做的坏处很多,比如:代码会显得很乱,可能会出现大量重复代码,最主要 的就是没有做到面向对象的封装性”,导致程序不容易维护。由此,聪明的程序员们提出了实体类的概念,也就是用类来封装业务所需要的数 据。public class User private S

2、tring uid;private String pwd;public String getUid() return uid;public void setUid(Stri ng uid) this.uid = uid;这样一来,我们在保存数据时,只需创建一个对象,然后通过“ 的方式来访问对象的属性,提高扩展性、提高复用性、代码简洁等等好处不言而喻。在实际使用中,实体类往往是和某个业务或者数据库表相对应的,看起来很简 单,但随着需求的复杂化,业务和业务之间可能会交叉,表和表之间可能会联合 查询。这样一来,以前一一对应的实体类,便无法满足需求,因为某个实体类中可能找 不到我们需要的属性,但是它却

3、在另一个实体类中,而我们又不想随便在某个实 体类中添加一个毫不相关的属性,因为这样做可能会打破类的职责单一原则。因此,我们不得不再新建一个实体类ClassAAndClassB,这个实体类包含了类 A和类B的所有属性,对于稍有经验的程序员来说,这绝对是个噩梦,因为组合的 可能性是在是太多,而且可能是很多个实体组合,等待我们的将是无数的实体 类,导致程序混乱不堪。小菜一直苦于此事,今天终于通过Java的反射和泛型写了一个联合实体类通过这个联合实体类,可以把任意多个实体类融合成一个实体类。联合实体类代码:1 import java .Ian g.reflect.Method;2 import jav

4、a.util.List;33 /*5*联合实体类6 * author 杨元7 *8 */9 public class Un iteE ntity 1010 联合实体对象集合11 List entitys = null;12 方法名称13 Stri ng fnName =;14 方法对象15 Method method = null;1716 /*17 *构造方法18 * param en titys需要联合的实体对象集合19 */20 public UniteEntity(List entitys)21 this.e ntitys = en titys;22 2523 /*24 *获取某个取值

5、方法25 * param fnName 方法名称26 * return该取值方法返回值类型27 */28 public Class getFu nctio n(Stri ng fnName)29 保存方法名称30 this.fnName = fnName;31 查找方法32 Method m = fin dMethod();33 判断方法是否存在34 if(m != null)35 获取目标方法的返回值类型 39 Class type = m.getReturnType(); 40保存取值 方法对象41 method = m;42 /返回该取值方法返回值类型 43 return type;44

6、 else45 return nu II;46 47 4848 /*49 *获取某个赋值方法50 * param fnName 方法名称51 * return该赋值方法参数类型52 */53 public Class setFu nctio n(Stri ng fnName) 55 /保存方法名称56 this.fnName = fnName;57 查找方法58 Method m = fin dMethod();59 判断方法是否存在60 if(m != null)61 获取目标方法的参数类型62 Class type = m.getParameterTypes()O; 63 保存赋值方法对象

7、64 method = m;65 返回该赋值方法参数类型66 retur n type;67 else68 return n ull;69 70 7171 /*72 *调用某个方法,为属性赋值73 * param 赋值方法的参数类型 75 * param c76 * param value 值内容77 */78 public void setValue(Class c,T value) 79 / 遍历实体类集合80 for(Object o : entitys)81 出错继续执行82 try83 method.i nv oke(o, value); break;84 catch(Excepti

8、on ex)85 86 8787 /*88 *调用某个方法,取得属性的值89 * param 取值方法的返回值类型 91 * param c92 * return取得值的内容93 */94 public T getValue(Class c) 95 / 遍历实体类集合96 for(Object o : en titys)97 出错继续运行98 try99 由于invoke返回的是Object类型,因此要强制转换成 T类型100 return (T)method.i nvoke(o);101 catch(Exception ex)102 103 return null;104 105105 /*

9、106 *从实体对象集合中查找某个方法107 * return方法对象108 */109 private Method fin dMethod()110 遍历集合,寻找方法111 for(Object o : entitys)112 保证出错能继续运行113 try114 获取对象所有公有方法115 Method methods = o.getClass().getMethods();117116 遍历方法117 for(Method m : methods)118 匹配是否有目标方法119 if(fnName.equals(m.getName()120 /返回方法对象121 return m

10、;122 123 124 catch(Exception ex)125 126 return null;127 128 调用方法:1 创建一个对象集合2 List list = new ArrayList();4 将需要融合的实体类填入集合5 list.add(new User();6 list.add( new En terprise();77 创建联合实体类对象8 Un iteE ntity ue = new Un iteE ntity(list);109 int i = 109;1210 调用实体类中方法名为setEnno的方法(赋值方法),并给一个参数i11 ue.setValue(u

11、e.setF un ctio n(setE nn o), i);12 调用实体类中方法名为getEnno的方法(取值方法),并打印返回值13 System.out.pri ntl n(ue.getValue(ue.getF un ctio n(getE nn o);说明:用法很简单,创建联合实体对象的时候必须传入需要融合的实体对象集合。如果想调用的方法是取值方法,则先调用联合实体对象的getFu nction方法,参数是方法的名称,一定要写对!最好是复制!这个步骤会查找到指定的方法, 并且确定该方法的返回值类型,然后把getFu nction方法的返回值作为参数,调用联合实体对象的getValue方法,即可取得属性值。如果想调用的方法是赋值方法,则先调用联合实体对象的setFu nctio n方法,同理,该方法会确定参数的类型,把 setFu nctio n方法的返回值作为参数,调用联合 实体对象的setValue方法,再加上需要赋给的值,即可给属性赋值。由于使用了泛型技术,所以本类比较安全、稳定。调用赋值方法时,如果传入的 值和方法的参数类型不同,直接赋值失败,不会抛出异常;调用取值方法时,直 接对取出来的值进行强制类型转换即可,无需验证数据类型(例如:in t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论