现在有一个场景: 有一个方法,他的作用是接收命令(字符串类型的)和该命令对应的参数。 这样的命令有N多个。这样的一个方法怎么实现? 按照传统的面向过程的思维:字符串操作截取出命令的String值。根据String的值。写出N多个if else if else 例如这样:

if(命令字1){

fun();

}

else if(命令字2){

fun();

}

...

...

如上就陷入了面向过程的思维。 那么如何使用java的反射 去优化这样的代码结构。 先说下思路:

利用java的反射 根据外部传入的不同的命令字,去动态的获取对应的class。再根据该class去创建对象。调用对象的方法,也可给对象赋值。动态的保存数据

编写一个抽象类 让所有命令字对应的bean去继承。在抽象类中实现公共方法,如有需要也可声明方法,让bean去分别实现 利用如上的思路就可以避开N多个 if else if else if else if

举个实际栗子: 创建一个bean 来保存命令的对应内容

public class ReflectBean extends SuperDemo {

private String name;

private int age;

public void getAge(){

System.out.println("getAge():"+this.Age);

}

public void getName(){

System.out.println("getName():"+ this.name);

}

public Demo1class(String name, int age) {

this.name = name;

this.age = age;

System.out.println("111111构造 函数被调用了 哈哈哈哈");

}

@Override

public String toString() {

return "ReflectBean{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}

再创建个superDemo

public abstract class SuperDemo {

//父类的方法 子类的公共方法哈

public void superDemo(){

System.out.println("wo shi super demo de fuc");

}

}

好了,如上 bean和对应的父类都创建好了。 接下来就开始反射了。 具体代码如下:

public class ReflectUtils {

public static Object getObjectByString(String className) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException {

//com.cn.reflectdemo.createobjectbystring.beans 类的包路径

className = "com.cn.reflectdemo.createobjectbystring.beans." + className;

//获取名字为className的class

Class clazz = Class.forName(className);

//获取指定参数类型的构造函数,这里传入我们想调用的构造函数所需的参数类型

Class[] classes = new Class[]{String.class, int.class};

Constructor constructor = clazz.getConstructor(classes);

Object object = constructor.newInstance("www", 22);

//调用对象的方法

// 调用ReflectBean类中的getAge方法

Method method = clazz.getMethod("getAge");

method.invoke(object);

//调用 getName的方法

method = clazz.getMethod("getName");

method.invoke(object);

//调用父类的方法

method = clazz.getMethod("superDemo");

method.invoke(object);

// 设置成员变量的值

Field f = clazz.getDeclaredField("age");

f.setAccessible(true);

f.set(object, 33);

System.out.println(object.toString());

//json 字符串 赋值给bean

//应用场景:外部json string 数据传递到服务端,服务端解析 保存

String jsonbody = "{\"name\":\"yyyy\", \"age\":444}";

// json转map

Map map = new LinkedHashMap<>();

map = JSON.parseObject(jsonbody, LinkedHashMap.class);

Field[] fields = clazz.getDeclaredFields();

// 转换为有下标的集合

List list = new ArrayList<>();

for (String key : map.keySet()) {

list.add(map.get(key));

}

for (int i = 0; i < list.size(); i++) {

//private属性设置可访问权限

fields[i].setAccessible(true);

fields[i].set(object, list.get(i));

}

System.out.println(object.toString());

return "";

}

public static void main(String[] args) throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException, NoSuchFieldException {

ReflectUtils.getObjectByString("ReflectBean");

}

如上 在实际开发中代码就显非常高大上了。 我们的口号是什么:写出别人看不懂的代码。

java 避免大量if else_利用java的反射避免 多个 if else if else if else if相关推荐

  1. java mysql jdbc 封装_利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包括增删改查、JavaBean反射原理,附源代码)...

    近期看老罗的视频,跟着完毕了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完毕对数据库的增删改查.当中查询这块,包含普通的查询和利用反射完毕的查询,主要包含以下几个函数接口 ...

  2. java break递归_如何利用Java递归解决“九连环”公式

    在之前有写到过一点点有关递归的东西,然后想到小时候自己玩的一个玩具--九连环.小时候自己曾经一边玩一边用笔记下来解开这个东西的公式,那是十几年前的事情了.前两天突然想起来,九连环的基本操作就是一个递归 ...

  3. java界面设计股票_利用JAVA实现股票交易系统设计参考.doc

    利用JAVA实现股票交易系统设计参考 目 录 摘要1 关键词1 Abstract2 Key words2 1 概述3 1.1 Java体系结构3 1.2 Java的优点3 1.3 Java的应用3 2 ...

  4. java 递归10 28_如何利用Java递归解决“九连环”公式

    在之前有写到过一点点有关递归的东西点击打开链接,然后想到小时候自己玩的一个玩具--九连环.小时候自己曾经一边玩一边用笔记下来解开这个东西的公式,那是十几年前的事情了.前两天突然想起来,九连环的基本操作 ...

  5. java calendar日期计算_利用Java中Calendar计算两个日期之间的天数和周数

    前言 究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别在哪呢? 比如有: 月份的定义 - 阳`(公)历 一年12 个月,每 ...

  6. java 方法数统计_利用Java简单实现一个代码行数统计器方法实例

    前言 哈喽,我是小黑, 最近学了java的输入输出流后一直心痒痒,总想找一点事情来做,所以用java代码来实现了一下统计代码的所有行数,看一下我上大学以来到底打了多少行. 先附上实现代码吧! pack ...

  7. java 获取文件名长度_利用Java文件类File的方法,获取磁盘文件的文件名、长度、大小等特性...

    利用Java文件类File的方法,获取磁盘文件的文件名.长度.大小等特性. 如题,大神们谁可以编写一个这样的java程序?     happy530755 | 浏览 1482 次 |举报 我 ...

  8. java日期相差周_利用Java中Calendar计算两个日期之间的天数和周数

    前言 究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别在哪呢? 比如有: 月份的定义 - 阳`(公)历 一年12 个月,每 ...

  9. java 生成pdf 乱码_利用java处理fop导出pdf的中文乱码问题解决方案

    本文的作用是,生成带中文的加密pdf格式的文件,防止被人修改. 在项目下建立docbook-xsl, fo-res, out, sample四个文件夹 docbook-xsl目录: 放从sourcef ...

最新文章

  1. 全球首届APMCon,带你给“应用性能”把把脉
  2. Debian+Pure-ftpd+MySQL+User manager for PureFTPd
  3. python换成中文版_在python中如何将“\”替换为“/”?
  4. HDUOJ---2112HDU Today
  5. leetcode 无重复字符的最长子串
  6. Makefile文件编写规则
  7. 超实用的PDF论文修改技巧
  8. kettle下载安装使用教程
  9. 2022-01-18国产Linux深度操作系统deepin20.4发布,涉及桌面和内核升级。
  10. 钉钉桌面版绑定其他邮箱
  11. 怎样清理苹果电脑磁盘空间_Mac启动磁盘已满?如何快速清理电脑磁盘
  12. 神经网络的三种训练方法,如何训练一个神经网络
  13. gioneem5Android版本,金立M5 Plus(金立GN8001) 版本线刷包
  14. cesium从入门到进阶(一):Viewer、Scene、Camera、加载第三方影像、地形服务
  15. JPEG图像文件格式
  16. 河南省平顶山市谷歌高清卫星地图下载
  17. 如何快速查询多个快递物流,并给拒收的单号标色
  18. 一张图看明白响应式和自适应的区别
  19. ABAQUS几何非线性问题:薄板大变形(如何定义材料方向)
  20. 京东java实习生一二面面经

热门文章

  1. jdk1.5的类转换成jdk1.4的类文件
  2. 通过在Global.asax文件中配置Application来统计的方法
  3. hadoop文件操作
  4. 卡耐基梅陇大学计算机学院名人,卡耐基梅陇大学
  5. MogDB/openGauss 手动部署(非OM工具)单机、主备、主备级联架构
  6. 跨年了,来玩儿个Database Crossword Puzzle吧!
  7. 谈谈有什么方法可以快捷实现多场景下的线程安全
  8. Tensorflow保存神经网络参数有妙招:Saver和Restore
  9. 谁说AI看不懂视频?
  10. 实战案例丨GaussDB for DWS如何识别坏味道的SQL