• springboot项目获取包下有RestController注解的class


    1. package com.wechat.util;
    2. import com.wechat.exception.WeChatException;
    3. import lombok.extern.slf4j.Slf4j;
    4. import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
    5. import org.springframework.beans.factory.config.BeanDefinition;
    6. import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
    7. import org.springframework.core.type.AnnotationMetadata;
    8. import org.springframework.core.type.classreading.MetadataReader;
    9. import org.springframework.core.type.filter.AnnotationTypeFilter;
    10. import org.springframework.core.type.filter.AssignableTypeFilter;
    11. import java.io.IOException;
    12. import java.lang.annotation.Annotation;
    13. import java.util.HashSet;
    14. import java.util.Objects;
    15. import java.util.Set;
    16. /**
    17. * 类扫描器
    18. *
    19. * @author 80123389
    20. */
    21. @Slf4j
    22. public class ClassScanner {
    23. /**
    24. * 扫描指定包下所有类
    25. *
    26. * @param packagePath 包路径
    27. * @param assignableType 要扫描的类类型
    28. * @return 类集合
    29. */
    30. public static Set> scanClasses(String packagePath, Class assignableType) {
    31. Set> classes = new HashSet<>();
    32. ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
    33. provider.addIncludeFilter(new AssignableTypeFilter(assignableType));
    34. for (BeanDefinition beanDefinition : provider.findCandidateComponents(packagePath)) {
    35. String className = beanDefinition.getBeanClassName();
    36. try {
    37. classes.add(Class.forName(className));
    38. } catch (ClassNotFoundException e) {
    39. log.info("类扫描失败:{}", className, e);
    40. }
    41. }
    42. return classes;
    43. }
    44. /**
    45. * 扫描指定包下所有带有指定注解的类
    46. *
    47. * @param packagePath 包路径
    48. * @param annotationClass 注解类
    49. * @return 类集合
    50. */
    51. public static Set> scanClassesWithAnnotation(String packagePath, Classextends Annotation> annotationClass) {
    52. Set> classes = new HashSet<>();
    53. ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false) {
    54. @Override
    55. protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
    56. MetadataReader metadataReader = null;
    57. try {
    58. metadataReader = getMetadataReaderFactory().getMetadataReader(Objects.requireNonNull(beanDefinition.getBeanClassName()));
    59. } catch (IOException e) {
    60. throw new WeChatException("类扫描失败", true);
    61. }
    62. AnnotationMetadata metadata = metadataReader.getAnnotationMetadata();
    63. Set annotationTypes = metadata.getAnnotationTypes();
    64. for (String annotationType : annotationTypes) {
    65. if (annotationClass.getName().equals(annotationType)) {
    66. return true; // 标记为候选组件
    67. }
    68. }
    69. return false;
    70. }
    71. };
    72. provider.addIncludeFilter(new AnnotationTypeFilter(annotationClass));
    73. for (BeanDefinition beanDefinition : provider.findCandidateComponents(packagePath)) {
    74. String className = beanDefinition.getBeanClassName();
    75. try {
    76. classes.add(Class.forName(className));
    77. } catch (ClassNotFoundException e) {
    78. log.info("类扫描失败:{}", className);
    79. }
    80. }
    81. return classes;
    82. }
    83. }
    package com.wechat;
    
    import cn.hutool.core.collection.CollectionUtil;
    import cn.hutool.core.util.ReflectUtil;
    import cn.hutool.json.JSONUtil;
    import io.swagger.annotations.Api;
    import lombok.extern.slf4j.Slf4j;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.web.bind.annotation.PostMapping;
    
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Set;
    
    /**
     * @ClassName SpringBootTest01
     * @Description
     * @Author xuxiang
     * @Date 11:17 2022/11/8
     **/
    @Slf4j
    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class SpringBootTest03 {
    
        @Test
        public void test01() throws Exception {
            Set> classesInPackage = ClassScanner.scanClassesWithAnnotation("com.wechat.api", Api.class);
            System.out.println(JSONUtil.toJsonStr(classesInPackage));
        }
    }
  • 相关阅读:
    【PyCharm中PIL/Pillow的安装】
    git 详解-提升篇
    深入了解JUC并发(一)什么是JUC
    java this用法
    Ubuntu源码编译gdal3.6.2
    Java 多线程共享模型之管程(上)
    MYSQL基础——函数
    基于SSM的校园快递一站式服务系统设计与实现
    axios拦截器的使用?
    【深入理解Kotlin协程】协程调度器Dispatchers源码追踪扒皮
  • 原文地址:https://blog.csdn.net/x_u_xiang/article/details/133951703