Java获取类和类注释信息

2023-11-08  本文已影响0人  Rain_z

背景

这几天需要整理下接口类名称和对应的类描述,如下图,需要取类名MyDemo 和@description的内容“测试Demo描述”,手动一个个整理显然不合适,写了一个Demo,代码比较粗糙,先说一下思路:

  1. 通过注解拿到想要的类(如果没有注解,通过扫描包下的类就可以了);
  2. 通过类的绝对路径读取类文件,找到描述文字取出(这里通过读文件方式是因为Java编译后,注释代码就没有了,只能通过读取源文件的方式);
/**
 * @author: Rain
 * @date: 2023-11-09
 * @description: 测试代码
 */
@Component
public class MyDemo {
    
}

这里需要两个依赖

<dependency>
            <groupId>org.reflections</groupId>
            <artifactId>reflections</artifactId>
            <version>0.9.11</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>22.0</version>
        </dependency>

直接上代码

/**
 * @author: Rain
 * @date: 2023-11-09
 * @description: 测试代码
 */
public class MyDemo {

    public static void main(String[] args) {
        // 扫描指定的包
        scanAnnotations("com.rain.demo");
    }

    private static void scanAnnotations(String pathStr) {
        Reflections reflections = new Reflections(pathStr);
        Set<Class<?>> annotatedClasses = reflections.getTypesAnnotatedWith(Component.class);
        for (Class<?> annotatedClass : annotatedClasses) {
            String desc = "";
            String simpleName = annotatedClass.getSimpleName();
            String name = annotatedClass.getPackage().getName();
            String fileName = "D://code/Demo/src/main/java/" + name.replace(".", "/") + "/"+ simpleName + ".java";
            desc = getDesc(fileName);
            //这里可以加点逻辑处理下desc数据,根据自己需要,然后把不要的*或者@符号这些删除就可以了
            System.out.println(annotatedClass.getSimpleName() + " , " + desc);
        }

    }

    private static String getDesc(String fileName) {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "UTF-8"))) {
            String line;
            while ((line = br.readLine()) != null) {
                if (line.contains("@Description") || line.contains("@description")) {
                    return line;
                }
                //这里是为了保证类注释不是标准的@description,而是直接文字描述也能正常取出
                if (line.contains("*") && !line.contains("@") && !line.contains("/*") && !line.contains(".*")) {
                    return line;
                }
            }
        } catch (Exception e) {
            return "无描述";
        }
        return "无描述";
    }
}
上一篇下一篇

猜你喜欢

热点阅读