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

上传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());
        }


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解析XML并将其转换为Java实,可以使用JAXB(Java Architecture for XML Binding)库。以下是解析XML并将其转换为Java实的一般步骤: 1. 首先,需要根据XML文件生成相应的XSD文件,该文件定义了XML的结构和约束。可以使用Trang工具通过以下命令生成XSD文件:java -jar trang.jar test.xml test.xsd。 2. 接下来,使用JAXBContext来创建一个上下文对象,该对象用于处理XML和Java实之间的转换关系。 3. 定义Java实体类,它们对应于XML中的元素和属性。 4. 使用JAXBUnmarshaller将XML文件解析为Java对象,并将其转换为Java实。可以使用unmarshal方法来完成这一步骤。 5. 现在,您可以使用Java对象来访问和操作XML中的数据。 以下是一个示例代码,展示了如何解析XML并将其转换为Java实: ```java // 创建JAXBContext对象 JAXBContext jaxbContext = JAXBContext.newInstance(YourEntity.class); // 创建Unmarshaller对象 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); // 使用unmarshal方法解析XML,并将其转换为Java实 YourEntity entity = (YourEntity) unmarshaller.unmarshal(new File("your_xml_file.xml")); ``` 请将"YourEntity"替换为您要转换的实体类的名称,并将"your_xml_file.xml"替换为您要解析的XML文件的路径。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [xml报文转Java实](https://blog.csdn.net/h_j_c_123/article/details/130869378)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值