V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ccppgo
V2EX  ›  Java

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

  •  1
     
  •   ccppgo · 94 天前 · 1342 次点击
    这是一个创建于 94 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    13 条回复    2021-09-03 10:37:03 +08:00
    Kimen
        1
    Kimen  
       94 天前
    写一个父类,让所有表的 service 实现类都去继承,然后用这个类去承接你反射出来的对象
    Kimen
        2
    Kimen  
       94 天前
    额,看错了,给所有表对象都继承一个 BaseEntity,然后左边就写 BaseEntity,Java 中的多态……
    beidounanxizi
        3
    beidounanxizi  
       94 天前
    写 Go 吧,写 JAVA 让你这么痛苦,反射来反射区好玩么?
    ccppgo
        4
    ccppgo  
    OP
       94 天前 via Android
    @Kimen 下午的时候跟组长一起研究怎么写好(我们 2 个 PHP 程序员)你说的这个已经试过了不行,报 equipment 不能转 entity,我们 equipment 有继承自 entity 的
    ccppgo
        5
    ccppgo  
    OP
       94 天前 via Android
    @beidounanxizi 写 go 小城市没饭吃
    chendy
        6
    chendy  
       94 天前
    玩不好泛型反射的话,就写点模板文件生成代码吧
    Kimen
        7
    Kimen  
       94 天前
    mmdsun
        8
    mmdsun  
       94 天前 via Android
    =号左边写父类,接口,或者 object 。然后直接反射再调 save 方法就行。
    SummerSec
        9
    SummerSec  
       93 天前 via Android
    多用反序列化和序列化,自己重新写反序列化和序列化方法。
    Macolor21
        10
    Macolor21  
       93 天前
    泛型不是这样写?
    public class EquimentService<T> {
    public void save(T obj){
    // .....
    }
    }
    写 BaseEntity 然后子类赋值给父类, 这不是多态吗?我学错了?还是上面的人没学好
    ccppgo
        11
    ccppgo  
    OP
       93 天前
    @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
        12
    Suaxi  
       93 天前
    private BaseMapper getBaseMapper(Class clazz) {
    return (BaseMapper) SpringContextUtil.getBean(clazz.getSimpleName().substring(0, 1).toLowerCase() + clazz.getSimpleName().substring(1) + "Dao");
    }

    clazz 动态传就可以了
    ccppgo
        13
    ccppgo  
    OP
       93 天前
    @Macolor21 看我下面一个回复, EquimentService save 需要的是子类, 如果传 BaseEntity 这里会报错, 如果是需要 BaseEntity 才可以传子类吧
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1422 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 00:05 · PVG 08:05 · LAX 16:05 · JFK 19:05
    ♥ Do have faith in what you're doing.