反射解析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());
        }



http://www.niftyadmin.cn/n/876712.html

相关文章

Spring之JdbcTemplate的使用

Spring之JdbcTemplate的使用一、什么是JdbcTemplate&#xff1f;二、基于XML方式使用JdbcTemplate1.添加依赖2.编写相关代码3.添加jdbc配置文件4.配置spring.xml5.执行测试二、基于注解方式使用JdbcTemplate1.添加依赖2.编写相关代码3.使用配置类代理spring.xml文件4.执行测试三…

IDEA中启动项目报错 Error:java: Compilation failed: internal java compiler error

IDEA中启动项目报错 Error:java: Compilation failed: internal java compiler error (默认maven项目)确认File-Project structure-Modules-对应的module使用的jdk版本正确 若正常,则去看Setting-Java Compiler-右侧per-module bytecode version列表中jdk版本是否正确

Spring之Spring的事务控制

Spring之Spring的事务控制一、Spring中的事务PlatformTransactionManagerTransactionDefinitionTransactionStatus事务的隔离级别事务的传播行为二、基于 XML 的声明式事务控制1.添加依赖2.配置spring.xml3.编写代码4.执行测试三、基于注解的声明式事务控制1.添加依赖2.配置spr…

Java编程思想--抽象类的具体使用

之前只是知道抽象类是什么,但是具体在项目中如何用到还是一知半解,今在项目中发现抽象类的其中一种用法--用于抽象返回类型:(感觉是很基础的东西,但是惭愧之前写代码并未用上) 定义为抽象类型为父类Model返回类型,其属性为子类Model返回类型的共有属性,具体查询时根据不同的条件…

RabbitMQ之快速入门(一)

RabbitMQ之快速入门&#xff08;一&#xff09;一、消息队列&#xff08;MQ&#xff09;概述什么是消息队列&#xff1f;AMQP和JMSAMQP和JMS的区别常见的 MQ 产品二、RabbitMq概述什么是RabbitMqRabbitMQ的特点RabbitMq的架构及相关概念RabbitMq的工作模式RabbitMq运行过程三、…

IDEA之--idea快捷键整理

只列举目前用到的&#xff0c;不断补充....... 常用Window快捷键&#xff1a; 1.windowsL 锁屏 2.AltTab 调到之前的应用 3.CtrlTab 应用内跳转到下一页 4.WindowsD 桌面。。。。 代码层次操作&#xff1a;1.Alt Enter 补全代码2.CtrlD 复制到下一行3.AltInsert …

IDEA之--idea同一窗口打开多个项目

很简单&#xff0c;将多个项目放在同一个文件夹下&#xff0c;File-Open直接打开共同的父文件夹 再根据项目来导入module,&#xff08;File-Project Structure-Modules-""-Import Module&#xff09;或者配置不同的maven或tomcat

RabbitMQ之六种工作模式的使用

RabbitMQ之六种工作模式的使用RabbitMQ工作模式一、简单模式1.引入依赖2.编写生产者3.编写消费者4.执行测试1.启动生产者2.启动消费者二、work模式1.引入依赖2.编写生产者3.编写消费者13.编写消费者24.执行测试1.启动两个消费者2.启动生产者三、Publish/Subscribe发布与订阅模式…