求教 Java 如何使用泛型和反射创建更加动态性的代码

2021-09-02 22:29:51 +08:00
 ccppgo

这是 PHP 的项目需要把数据库数据同步到 java 后台, 已经使用队列实现完成。

这里有一个 Equipment 表已经使用反射方便的实现了添加和修改事件。

还有大约十几个表需要实现相同的功能, 他们唯一的不同只是 mybatis plus 的 具体表的 service, 以及具体的表类对象。

我想使用更加动态化的技术实现, 避免写一大堆这样的文件, 但是不知道如何做, 特别是知道了表类对象的 class 以后我可以使用 getClass.newInsetance()去生成新对象, 但是=号左边如何写?如: 什么什么 = Class.forName(className).newInsetance()

以及使用 spring getbean 获取 service 之后, 怎么写 seve 和 updateById 方法, 求 java 大佬赐教,

2093 次点击
所在节点    Java
13 条回复
Kimen
2021-09-02 22:59:48 +08:00
写一个父类,让所有表的 service 实现类都去继承,然后用这个类去承接你反射出来的对象
Kimen
2021-09-02 23:05:02 +08:00
额,看错了,给所有表对象都继承一个 BaseEntity,然后左边就写 BaseEntity,Java 中的多态……
beidounanxizi
2021-09-02 23:14:34 +08:00
写 Go 吧,写 JAVA 让你这么痛苦,反射来反射区好玩么?
ccppgo
2021-09-02 23:15:29 +08:00
@Kimen 下午的时候跟组长一起研究怎么写好(我们 2 个 PHP 程序员)你说的这个已经试过了不行,报 equipment 不能转 entity,我们 equipment 有继承自 entity 的
ccppgo
2021-09-02 23:15:57 +08:00
@beidounanxizi 写 go 小城市没饭吃
chendy
2021-09-02 23:23:02 +08:00
玩不好泛型反射的话,就写点模板文件生成代码吧
Kimen
2021-09-02 23:26:55 +08:00
mmdsun
2021-09-03 01:02:48 +08:00
=号左边写父类,接口,或者 object 。然后直接反射再调 save 方法就行。
SummerSec
2021-09-03 09:23:09 +08:00
多用反序列化和序列化,自己重新写反序列化和序列化方法。
Macolor21
2021-09-03 09:57:36 +08:00
泛型不是这样写?
public class EquimentService<T> {
public void save(T obj){
// .....
}
}
写 BaseEntity 然后子类赋值给父类, 这不是多态吗?我学错了?还是上面的人没学好
ccppgo
2021-09-03 10:29:02 +08:00
@Kimen
@mmdsun


[![hyZLp6.png]( https://z3.ax1x.com/2021/09/03/hyZLp6.png)]( https://imgtu.com/i/hyZLp6)

[![hyel90.png]( https://z3.ax1x.com/2021/09/03/hyel90.png)]( https://imgtu.com/i/hyel90)

找到方法了, 好像直接写不行, 得完全反射
Suaxi
2021-09-03 10:34:06 +08:00
private BaseMapper getBaseMapper(Class clazz) {
return (BaseMapper) SpringContextUtil.getBean(clazz.getSimpleName().substring(0, 1).toLowerCase() + clazz.getSimpleName().substring(1) + "Dao");
}

clazz 动态传就可以了
ccppgo
2021-09-03 10:37:03 +08:00
@Macolor21 看我下面一个回复, EquimentService save 需要的是子类, 如果传 BaseEntity 这里会报错, 如果是需要 BaseEntity 才可以传子类吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/799567

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX