乐云一 2022-03-01 10:26 采纳率: 33.3%
浏览 55
已结题

只有Collection子接口,List、Set这样的接口的Class字节码时,怎么生成他对应的子类。

前置条件:最近在写框架工具,现拿到了一个类的class,遍历他的属性时,遇到Collection的子接口问题时,无法确定类中的属性是一个List还是set 或者Queue ,只能确定属性是Collection的子接口。但是需要遍历这个属性的同时,假如他是集合类,则需要调用其add方法,所以需要拿到这个属性的实例子类。

需求例子:比如我通过反射获得了一个类的属性:

private List<String> list

有了list的字节码class,现在需要创建他的某个子类实例对象并且调用其中的方法。
因为是list是接口,所以不能通过class创建其实例

  • 写回答

4条回答 默认 最新

  • 乐云一 2022-03-01 11:26
    关注

    此贴终结, 方案: 取class分类讨论。

                                        //属性
                                        Object instance = tempC.newInstance();
                                        //迭代解析
                                        resoleParam(instance,instance.getClass());
                                        Collection collection = null;
                                        //如果是list 这样的接口或抽象类
                                        if(aClass.isInterface()|| Modifier.isAbstract(aClass.getModifiers())){
                                            //实例化它的可用类
                                           collection = getNewInstanceWhenCollection(aClass);
                                        }else{
                                            //如果是可实例子类,则直接调用
                                            collection = (Collection)aClass.newInstance();
                                        }
    
                                        collection.add(instance);
                                        field.set(obj,collection);
    
        /**
         * 当class为collection 子接口或抽象类时,分类讨论 取出适合class的子类实例
         * @param clazz
         * @return
         */
        private Collection getNewInstanceWhenCollection(Class clazz){
            //判断是否是集合
            if(!Collection.class.isAssignableFrom(clazz)){
                return null;
            }
    
            //判断是list分支吗
            if(List.class.isAssignableFrom(clazz)){
                return new ArrayList();
            }
    
            //判断是set分支吗
            if(Set.class.isAssignableFrom(clazz)){
                return new HashSet();
            }
    
            //判断是队列分支吗
            if(Queue.class.isAssignableFrom(clazz)){
                return new LinkedList();
            }
            return null;
        }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月6日
  • 已采纳回答 3月29日
  • 修改了问题 3月1日
  • 修改了问题 3月1日
  • 展开全部

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c