背景
这几天需要整理下接口类名称和对应的类描述,如下图,需要取类名MyDemo 和@description的内容“测试Demo描述”,手动一个个整理显然不合适,写了一个Demo,代码比较粗糙,先说一下思路:
- 通过注解拿到想要的类(如果没有注解,通过扫描包下的类就可以了);
- 通过类的绝对路径读取类文件,找到描述文字取出(这里通过读文件方式是因为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 "无描述";
}
}
网友评论