首先介绍一下我遇到的问题,由于之前同事设计表有问题(将人员不同类型的数据全部拆到不同的数据表中,导致人员相关的数据表有10几张),这10几张表的除了itemCode不同之外其他字段几乎一样,导致每一次查询列表或者在做更新操作的时候,都需要根据itemCode去写很多 if else 操作。如下:![在这里插入图片描述](https://img-blog.csdnimg.cn/b7683983e4874b99be753713c58c367d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFuaWVs5aSn5qCR,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
最近在有一个需求,需要对人员数据进行更新操作,而且是每一种itemCode的人员都需要对那几个字段进行更新,如果按照以往的思路肯定也是写一堆的if else进行操作,但这次,我打算使用反射的方式。
首先我第一步使用的是将每一个itemCode对应的mapper接口抽取到Enum中,key是itemCode value是对应的mapper接口文件的路径,当itemCode过来的时候根据code获取mapper的具体接口名+地址,
String clasName = ItemEnum.getValue(itemCode);
再通过Class clz = Class.forName(clasName);
拿到Class对象,具体步骤如下:
对象拿到之后就可以调用更新的方法了,最后调用method的invoke方法将对象和更新的参数进去执行就可以了。
这里在获取动态代理类实例的时候用到了SqlSession做注入,以及自定义了一个实现了InvocationHandler的Handler
简单的描述一下Java的反射:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性。这种动态获取信息及动态调用对象方法的功能叫Java的反射机制。反射可以获取对象所有的public属性和和方法,对于私有的或者是受保护的,需要将setAccessible设置为true来访问它的私有属性和方法,并且对于普通的类,在使用反射时要被反射的类还必须提供一个无参的构造方法。
以上内容只是大概描述了一下自己使用反射解决的问题,java反射还有很多东西,也需要慢慢学习。