SpringBoot扫描包获取类信息-基于实现类\接口

SpringBoot扫描包获取类信息-基于实现类\接口

需求:获取包下面实现了某个类的所有类

基于实现类

 /**
     * * 获取包下面所有实现了clz类的全限定名
     *
     * @param packgeName 包名
     * @param clz        父类名
     * @return
     */
    public static List<String> getClassFQName(String packgeName, Class clz) {
        final String BASE_PACKAGE = packgeName;
        final String RESOURCE_PATTERN = "/**/*.class";
        ArrayList<String> list = new ArrayList<>();
        if (packgeName == null || clz == null) {
            return list;
        }
        //spring工具类,可以获取指定路径下的全部类
        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        try {
            String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
                    ClassUtils.convertClassNameToResourcePath(BASE_PACKAGE) + RESOURCE_PATTERN;
            Resource[] resources = resourcePatternResolver.getResources(pattern);
            //MetadataReader 的工厂类
            MetadataReaderFactory readerfactory = new CachingMetadataReaderFactory(resourcePatternResolver);
            for (Resource resource : resources) {
                //用于读取类信息
                MetadataReader reader = readerfactory.getMetadataReader((org.springframework.core.io.Resource) resource);
                //扫描到的class
                String classname = reader.getClassMetadata().getClassName();
                Class<?> clazz = Class.forName(classname);

                //判断是否有指定主解
//                MyAnno anno = clazz.getAnnotation(MyAnno.class);
//                if (anno != null) {
//                    //将注解中的类型值作为key,对应的类作为 value
//                    handlerMap.put(classname, clazz);
//                }

                // 判断是否实现指定类型
                //isAssignableFrom()方法是判断是否是某个类的父类
                if (clz.isAssignableFrom(clazz)) {
                    list.add(clazz.getName());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

测试

    @Test
    public void test006() throws InstantiationException, IllegalAccessException {
        final String BASE_PACKAGE = "com.sifan.erp.common";
        List<String> classFQName = CommonUtil.getClassFQName(BASE_PACKAGE, Job.class);
        classFQName.forEach(System.out::println);
    }

结果:成功获取所有实现了Job接口的类
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值