java吧 关注:1,218,469贴子:12,670,652

求助贴 涉及放射,反序列化和类型转换

只看楼主收藏回复

先说问题: 现在有一个需求,输入一个json串,里面包含一个类名(全限定名),还有这个类对应的数据。因为json中的数据是不确定的,所以json中包含这个类名(全限定名)。可以通过类名反射拿到类信息,再反序列化都没问题,问题就是反序列化后类型是Object,我需要转为json中带过来的类(全限定名)。因为类都是已经定义好的,我可以使用instanceof来确定。 说了一大堆,问题来了,我怎么把instanceof这块代码通用化,写成工具类,入参就是反序列化后的Object,返回的是具体的类型。
网上找了一大堆,都是摊开业务讲技术的,耍流氓。



IP属地:广东来自Android客户端1楼2022-06-08 00:51回复
    查资料发现一个有意思的地方,这个作者是真的会


    IP属地:广东来自Android客户端2楼2022-06-08 00:53
    回复
      想了一圈,因为是动态的,加上泛型擦除,应该没有很好的实现方法。


      IP属地:广东来自Android客户端3楼2022-06-08 01:15
      收起回复
        gson
        不要再造重复的轮子啦


        4楼2022-06-08 01:28
        回复
          用gson 新建类然后变量的数据类型都写好
          tojson fromjson
          你值得拥有
          业务,怎么快怎么来,没必要自己研究
          如果你非要研究我再告诉你咋整,但我都嫌麻烦


          5楼2022-06-08 01:30
          收起回复
            感觉你不是很明确需求。
            什么叫"返回的是具体类型?"
            你打算用什么东西接收返回值,Object?
            因为你转换后的对象类型本身就是不确定的,你需要依靠instance of来判断具体走哪条分支。而且因为java没有smart cast需要一次手动类型强制转换


            IP属地:福建来自Android客户端6楼2022-06-08 02:00
            收起回复
              类对象都有了,不是随便转,不是一行代码的事


              IP属地:广东来自Android客户端7楼2022-06-08 02:02
              回复
                数据有,类型有,不是直接就可以转?


                IP属地:四川来自Android客户端8楼2022-06-08 02:28
                回复
                  楼上gson就不错,用json是为了web传输还是用户改动?为啥不用yaml和config相关库,反射,动态功能都有


                  IP属地:山东来自Android客户端9楼2022-06-08 02:29
                  回复
                    动态类型转换,没什么解决办法吧


                    IP属地:河南来自Android客户端10楼2022-06-08 02:34
                    收起回复
                      说实话,我看了几遍,没完全看懂楼主的诉求,有点不知所云。
                      反序列化的时候,不是可以直接传入Class类型,直接转成指定的类型吗?


                      IP属地:湖北11楼2022-06-08 10:33
                      收起回复
                        感觉这个操作很危险,会不会注入一个恶意类型,你反射然后系统挂了。还是业务拆分多写几个接口一一接收坝。这样写了以后很难维护,耦合度太高了,一挂挂一片。


                        IP属地:湖北12楼2022-06-08 16:00
                        收起回复
                          我理解的业务场景是,一个接收消息的接口,可能存在很多种消息类型,每个消息类型都有不同的处理逻辑,现在一个消息(json)进来了,有一个dataType字段标明了这个消息的消息类型,那我直接根据消息类型去找对应的处理类来处理就行了呀。
                          1.如果集成了spring,那直接把处理消息的handler,当作模组注册到spring容器里面,然后模组的名字就是dataType,这样就可以根据dataType来获取到指定的处理类。
                          2.如果没有用到spring,那通过枚举,将dataType与处理类关联起来,也能达到同样的效果。


                          IP属地:湖北13楼2022-06-08 17:21
                          收起回复
                            我不明白为什么会从外部传入一个全路径的类名,外部系统怎么知道内部系统有没有这个类?这样不会经常报错吗?反正我是没见过这么搞的。


                            IP属地:湖北14楼2022-06-08 17:27
                            收起回复

                              在使用JSON.parseObject方法,将json字符串反序列化成java类的时候,直接将你前面通过加载器加载全路径得到的aClass传进去,不就行了吗?


                              IP属地:湖北15楼2022-06-08 17:38
                              收起回复