利用反射来去除if判断语句

我的以前写的一个查分系统,就是部长让我写的那个,使用一个分发器(函数),他会根据传递进来的字符串参数调用不同的方。 If(“add”.equalsIgnoreCase(funcName)) { return add();} ,每增加一个方法,就需要增加一个if分支,这样需要不断的修改原来的代码,需要重新编译,容易出错,面向对象的原则是“对修改关闭,对扩展开放”,因此我试着用另外一种方法来实现,利用“反射”。我们实现原理是:传入的类名称字符串,根据类名直接实例化该对象,调用内部方法。

1、因为每个函数都是用来执行一定的业务逻辑的(操作数据库),因此先定义一个接口,然后定义一个service函数,这个接口的主要功能就是能实现业务函数名称统一化,规范化,(我只要调同一个函数就可以,但类的不同函数内部实现是不一样化),实例化对象时变量的引用使用该类型(多态),如果不这样,那需要频繁的修改代码,类型不同吗,你懂得。

1、每个相应的业务功能分别定义为一个类,并继实现接口,并实现service函数,例如 增加人员信息为一个类,删除人员信息为一个类,根据不同的类,函数的实现也不同,具体实现不在叙述。

2、这样就可以将上边的if语句去掉,利用java反射机制,只要传入相关业务类的类名 字符串 ,利用反射实例化该类,并调用service方法,就可以实现相关的业务逻辑。

使用上边方法,如果要增加新的业务,例如:修改人员信息,只要定义新的业务类,并实现上述接口,实现servcie方法,只要传入该类的类名,就可自动调用service方法实现业务逻辑,根本就不需要修改原来(用反射代替if判断)的代码了。就算删除该业务类,也比较方边,不使用该类即可,想反,if判断 就需要修改代码,删除相关的业务分支。

如果类名比较长,传入字符串不方便,可定义一个配置文件,key=value的形式,key是类名的别名,value是类的全路径名,只要传入该key值,然后利用程序去查找配置文件,找出对应的value,便可找到该类名,并利用反射实例化。

具体的反射使用方法,可参考本空间的另一篇文章,java反射。

java设计模——反射的应用 (利用反射来去除if判断语句)的更多相关文章

  1. Java中的反射机制,利用反射访问私有

    利用反射,首先是Class对象的获取,之后是Method和Field对象的获取. 以Method为例,从文档中可以看到: getMethod()方法返回的是public的Method对象, 而getD ...

  2. 【java】工厂模式Factory,利用反射改进

    package 反射; interface Product{ public void produce(); } class socks implements Product{ @Override pu ...

  3. C#反射实例(一) 利用反射使用类库

    在网上查找了不少的资料,可以说大同小异,概念性的东西网上一搜一堆,今天把反射的东西整理了一下,供大家使用,我保证我这里是最全面的东西,当然也是基础的东西,在学好了这一切的基础上,大家可以学习反射的具体 ...

  4. Java设计模-过滤器模式

    过滤器模式 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接 ...

  5. Java实现回形数,只利用数组、循环和if-else语句

    import java.util.Scanner; public class learn { public static void main(String[] args){ System.out.pr ...

  6. 利用 操作符特性 代替if判断语句

    参考:http://blog.csdn.net/speedme/article/details/22916181 1.&&的判断特性 #include <stdio.h> ...

  7. Java开发笔记(七十九)利用反射技术操作私有属性

    早在介绍多态的时候,曾经提到公鸡实例的性别属性可能被篡改为雌性,不过面向对象的三大特性包含了封装.继承和多态,只要把性别属性设置为private私有级别,也不提供setSex这样的性别修改方法,那么性 ...

  8. [Java反射基础四]通过反射了解集合泛型的本质

    本文接上文"方法反射的基本操作",利用反射了解下java集合中泛型的本质 1.初始化两个集合,一个使用泛型,一个不使用 ArrayList list1 = new ArrayLis ...

  9. java利用反射调用类的某个方法

    java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...

随机推荐

  1. Linux上安装Oracle的教程-centos7

    一.安装Oracle前准备 1.创建运行oracle数据库的系统用户和用户组   [humf@localhost ~]$ su root #切换到root   Password:   [root@lo ...

  2. 滑动窗口解决Substring Search Problem

    2018-07-18 11:19:19 一.Minimum Window Substring 问题描述: 问题求解: public String minWindow(String s, String ...

  3. LeetCode--104--二叉树的最大深度

    问题描述: 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null, ...

  4. SMTP 发邮件

    public class EmailOrderProcessor :IOrderProcessor { private EmailSettings es; public EmailOrderProce ...

  5. 如何用Curl 来post xml 数据

    因为登陆服务升级,密码策略变更,以前的测试脚本中的用户密码已经不能登陆,试图通过API直接更改密码,一种是直接update,一种是change,使用curl的时候均未成功. 最后索性重新用curl命令 ...

  6. ECC算法整理纪要

    初始ECC算法 1.用户A 密钥生成 (1):用随机数发生器产生随机数k∈[1,n-1]: (2):计算椭圆曲线点PA=[k]G,为公钥,k为用户A私钥: 2. 用户B加密算法及流程 设需要发送的消息 ...

  7. BZOJ3544 [ONTAK2010]Creative Accounting

    看不懂题,就不能写的稍微像人话点吗我去... 题目就是要找一段区间使得Σai mod m的值最大. 于是嘛...前缀和一下再贪心就好了. 先求出前i个数的前缀和s,然后用s更新解. 还有可能就是前面的 ...

  8. 069——VUE中vuex之使用getters高效获取购物车商品总价

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. IntentService的用法,对比Service它会按顺序执行,不会像Service一样并发执行。

    package com.lixu.intentservice; import android.app.Activity; import android.content.Intent; import a ...

  10. poj 1330 Nearest Common Ancestors(LCA 基于二分搜索+st&rmq的LCA)

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30147   Accept ...