qdox 小demo

196 阅读1分钟

使用说明或不太熟悉的请看这个qdox readMe 翻译,本文主要做些零散的记录

API文档说明javadoc API

一、解析文件夹下所有类

import com.thoughtworks.qdox.JavaProjectBuilder;
import com.thoughtworks.qdox.model.JavaClass;
import com.thoughtworks.qdox.model.JavaMethod;

import java.io.File;
import java.io.IOException;

public class QdoxExample {
    public static void main(String[] args) {
        JavaProjectBuilder builder = new JavaProjectBuilder();
        try {
            // 添加要解析的 Java 文件或目录
            builder.addSourceTree(new File("src/main/java"));

            // 获取所有解析到的类
            for (JavaClass javaClass : builder.getClasses()) {
                System.out.println("Class: " + javaClass.getName());
                
                // 获取类中的方法
                for (JavaMethod method : javaClass.getMethods()) {
                    System.out.println("  Method: " + method.getName());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

qdox强大之处在于 ,编译不通过的代码也能分析

@Test
public void StringReader() {
   try {
      JavaProjectBuilder builder = new JavaProjectBuilder();
      builder.addSource(new StringReader("package web_test;\n" +
            "\n" +
            "/**\n" +
            " * @description:\n" +
            " * @author: \n" +
            " * @Date: 2024/7/5\n" +
            " */\n" +
            "public class Student {\n" +
            "\n" +
            "    /**\n" +
            "     * 获取名称\n" +
            "     * @param people\n" +
            "     * @return\n" +
            "     */\n" +
            "    private String getNameByPeople(People people){\n" +
            "        return "sss";\n" +
            "    }\n" +
            "\n" +
            "}\n"));
      // 获取所有解析到的类
      for (JavaClass javaClass : builder.getClasses()) {
         System.out.println("Class: " + javaClass.getName());
         // 获取类中的方法
         for (JavaMethod method : javaClass.getMethods()) {
            System.out.println("  Method: " + method.getName());
            for (JavaParameter parameter : method.getParameters()) {
               System.out.println("  parameterName: " + parameter.getName());
               System.out.println("  parameterType: " + parameter.getType());
               parameter.getType().getFullyQualifiedName();
            }
         }
      }
      int i = 0;
   } catch (Throwable e) {
      log.error("WebTestApplicationTests.contextLoads Exception ",e);
   }
}

JavaProjectBuilder 下 ddSourceFolder 和 addSourceTree 区别

addSourceFolder:

向javaprojectbuilder添加一个源文件夹,但不解析任何文件。这是一个惰性解析器。只有在调用JavaClass时,才会通过将包与文件夹结构匹配,并将类名与文件名匹配来搜索它。 addSourceFolder: ,可以处理单个 Java 文件或包含 Java 源文件的文件夹。如果提供的是文件夹,它也会递归地扫描文件夹中的所有 .java 文件。