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

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

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

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

private List<String> list

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

  • 写回答

4条回答 默认 最新

  • 乐云一 2022-03-01 03: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月5日
  • 已采纳回答 3月29日
  • 修改了问题 3月1日
  • 修改了问题 3月1日
  • 展开全部

悬赏问题

  • ¥60 优博讯DT50高通安卓11系统刷完机自动进去fastboot模式
  • ¥15 minist数字识别
  • ¥15 在安装gym库的pygame时遇到问题,不知道如何解决
  • ¥20 uniapp中的webview 使用的是本地的vue页面,在模拟器上显示无法打开
  • ¥15 网上下载的3DMAX模型,不显示贴图怎么办
  • ¥15 关于#stm32#的问题:寻找一块开发版,作为智能化割草机的控制模块和树莓派主板相连,要求:最低可控制 3 个电机(两个驱动电机,1 个割草电机),其次可以与树莓派主板相连电机照片如下:
  • ¥15 Mac(标签-IDE|关键词-File) idea
  • ¥15 潜在扩散模型的Unet特征提取
  • ¥15 iscsi服务无法访问,如何解决?
  • ¥15 感应式传感器制作的感应式讯响器
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部