反射解析jar包 并获取List集合的泛型类型与数组的对象类型(两种情况实体类属性为List和方法体参数为List)

本文介绍了一种从MultipartFile类型的文件中解析Jar包的方法,包括如何获取方法详情及实体类属性的泛型类型。通过反射机制实现了对方法参数、返回类型及实体类属性为List或数组时的泛型信息的获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上传MultipartFile类型jar包,反射解析jar包 获取方法详情,实体类属性或方法体参数为List(数组)时,获取List集合的泛型类型数组的对象类型

直接上代码:(方法体做了简化,其中的Class genericType为泛型类型),有问题或者有更简单的方法请指正...

 1.  方法体参数为集合*(数组)时,获取集合(数组)的泛型类型

    @RequestMapping(value = "/getDubboInfo", method = RequestMethod.POST)
    @ResponseBody
    public voidgetDubboInfo1(HttpServletRequest request, HttpServletResponse response,
                               @RequestParam(value = "dubboFile", required = true) MultipartFile dubboFile,
                               @RequestParam(value = "interfaceName", required = true) String interfaceName,
                               @RequestParam(value = "methodName", required = true) String methodName) {
        String filepath = "D:/";
        try {
            String fileName = dubboFile.getOriginalFilename();
            filepath = filepath + "/" + fileName;
            File jarFile = new File(filepath);
            dubboFile.transferTo(jarFile);
            URL url = jarFile.toURI().toURL();
            URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url}, Thread.currentThread().getContextClassLoader());
            Class<?> myclass = urlClassLoader.loadClass(interfaceName);
            //通过getMethod得到类中包含的方法
            Method[] m = myclass.getDeclaredMethods();
            for (int i = 0; i < m.length; i++) {
                // 得到方法的返回值类型的类类型
                Class<?> returnType = m[i].getReturnType();
                String operation = m[i].getName();//方法名
                if (operation.toLowerCase().equals(methodName.toLowerCase())) {//匹配到对应方法,这里假定方法名唯一,没有方法重载,实际请客要做判断处理
                    Parameter[] params = m[i].getParameters();
                    Map<String, Object> param = new HashMap<>();
                    for (Parameter parameter : params) {
                        String typeName = parameter.getParameterizedType().getTypeName();
                        String name = parameter.getName();
                        param.put(name, typeName);
                        Class<?> classType = parameter.getType();
                            //分别判断参数为数组或集合并获取泛型和数组类型
                            try {
                                if (classType.isArray()) {
                                    Class genericType = classType.getComponentType();
                                    //定义Array的类型
                                }
                                if (classType.isAssignableFrom(List.class)) {
                                    Type type = parameter.getParameterizedType();
                                    ParameterizedType parameterizedType = (ParameterizedType) type;
                                    Type[] types = parameterizedType.getActualTypeArguments();
                                    String genericName = types[0].getTypeName();
                                    //定义List<>中的泛型类
                                    Class<?> genericType = null;
                                    try {
                                        genericType = Class.forName(genericName);
                                    } catch (ClassNotFoundException e) {
                                        genericType = urlClassLoader.loadClass(genericName);
                                    }
                                }
                            } catch (ClassNotFoundException e) {
                                logger.error("方法中参数类型为List和Array时获取泛型类型出错", e);
                            }

                    }
                }
            }
        } catch (MalformedURLException e) {
            logger.error(e.getMessage(), e);
        } catch (ClassNotFoundException e1) {
            logger.error("找不到对应的接口", e1);
        } catch (IOException e1) {
            logger.error(e.getMessage(), e1);
        }

    }

2. 实体类属性为List(数组)时

       try{
            Class<?> cls = classLoader.loadClass(entityName);//实体类类名
            Class<?> genericType = null;
            Field[] fields = cls.getDeclaredFields();
            for(Field field : fields){
                //field.getType()--属性的类型;field.getName()属性的名字
                if(field.getType().isAssignableFrom(List.class)){
                    Type type = field.getGenericType();
                    //得到泛型类型的类名
                    ParameterizedType parameterizedType = (ParameterizedType) type;
                    Type[] types = parameterizedType.getActualTypeArguments();
                    String genericName = types[0].getTypeName();
                    //String genericName = type.getTypeName();
                    try{
                        genericType = Class.forName(genericName);
                    }catch (ClassNotFoundException e){
                        genericType = classLoader.loadClass(genericName);
                    }
                }
            }
        }catch (ClassNotFoundException e){
            logger.config(e.getMessage());
        }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值