java 避免大量if else_利用java的反射避免 多个 if else if else if else if
现在有一个场景: 有一个方法,他的作用是接收命令(字符串类型的)和该命令对应的参数。 这样的命令有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相关推荐
- java mysql jdbc 封装_利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包括增删改查、JavaBean反射原理,附源代码)...
近期看老罗的视频,跟着完毕了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完毕对数据库的增删改查.当中查询这块,包含普通的查询和利用反射完毕的查询,主要包含以下几个函数接口 ...
- java break递归_如何利用Java递归解决“九连环”公式
在之前有写到过一点点有关递归的东西,然后想到小时候自己玩的一个玩具--九连环.小时候自己曾经一边玩一边用笔记下来解开这个东西的公式,那是十几年前的事情了.前两天突然想起来,九连环的基本操作就是一个递归 ...
- java界面设计股票_利用JAVA实现股票交易系统设计参考.doc
利用JAVA实现股票交易系统设计参考 目 录 摘要1 关键词1 Abstract2 Key words2 1 概述3 1.1 Java体系结构3 1.2 Java的优点3 1.3 Java的应用3 2 ...
- java 递归10 28_如何利用Java递归解决“九连环”公式
在之前有写到过一点点有关递归的东西点击打开链接,然后想到小时候自己玩的一个玩具--九连环.小时候自己曾经一边玩一边用笔记下来解开这个东西的公式,那是十几年前的事情了.前两天突然想起来,九连环的基本操作 ...
- java calendar日期计算_利用Java中Calendar计算两个日期之间的天数和周数
前言 究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别在哪呢? 比如有: 月份的定义 - 阳`(公)历 一年12 个月,每 ...
- java 方法数统计_利用Java简单实现一个代码行数统计器方法实例
前言 哈喽,我是小黑, 最近学了java的输入输出流后一直心痒痒,总想找一点事情来做,所以用java代码来实现了一下统计代码的所有行数,看一下我上大学以来到底打了多少行. 先附上实现代码吧! pack ...
- java 获取文件名长度_利用Java文件类File的方法,获取磁盘文件的文件名、长度、大小等特性...
利用Java文件类File的方法,获取磁盘文件的文件名.长度.大小等特性. 如题,大神们谁可以编写一个这样的java程序? happy530755 | 浏览 1482 次 |举报 我 ...
- java日期相差周_利用Java中Calendar计算两个日期之间的天数和周数
前言 究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别在哪呢? 比如有: 月份的定义 - 阳`(公)历 一年12 个月,每 ...
- java 生成pdf 乱码_利用java处理fop导出pdf的中文乱码问题解决方案
本文的作用是,生成带中文的加密pdf格式的文件,防止被人修改. 在项目下建立docbook-xsl, fo-res, out, sample四个文件夹 docbook-xsl目录: 放从sourcef ...
最新文章
- 全球首届APMCon,带你给“应用性能”把把脉
- Debian+Pure-ftpd+MySQL+User manager for PureFTPd
- python换成中文版_在python中如何将“\”替换为“/”?
- HDUOJ---2112HDU Today
- leetcode 无重复字符的最长子串
- Makefile文件编写规则
- 超实用的PDF论文修改技巧
- kettle下载安装使用教程
- 2022-01-18国产Linux深度操作系统deepin20.4发布,涉及桌面和内核升级。
- 钉钉桌面版绑定其他邮箱
- 怎样清理苹果电脑磁盘空间_Mac启动磁盘已满?如何快速清理电脑磁盘
- 神经网络的三种训练方法,如何训练一个神经网络
- gioneem5Android版本,金立M5 Plus(金立GN8001) 版本线刷包
- cesium从入门到进阶(一):Viewer、Scene、Camera、加载第三方影像、地形服务
- JPEG图像文件格式
- 河南省平顶山市谷歌高清卫星地图下载
- 如何快速查询多个快递物流,并给拒收的单号标色
- 一张图看明白响应式和自适应的区别
- ABAQUS几何非线性问题:薄板大变形(如何定义材料方向)
- 京东java实习生一二面面经
热门文章
- jdk1.5的类转换成jdk1.4的类文件
- 通过在Global.asax文件中配置Application来统计的方法
- hadoop文件操作
- 卡耐基梅陇大学计算机学院名人,卡耐基梅陇大学
- MogDB/openGauss 手动部署(非OM工具)单机、主备、主备级联架构
- 跨年了,来玩儿个Database Crossword Puzzle吧!
- 谈谈有什么方法可以快捷实现多场景下的线程安全
- Tensorflow保存神经网络参数有妙招:Saver和Restore
- 谁说AI看不懂视频?
- 实战案例丨GaussDB for DWS如何识别坏味道的SQL