1. 程式人生 > 其它 >java原始碼解析之qdox

java原始碼解析之qdox

前言

qdox可以將一個java原始碼解析成一個包含class的物件,通過這個物件我們可以獲取所有方法,屬性,方法引數,返回值,註釋,tag等資訊。

簡單使用

待解析的原始碼如下


import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.Deflater;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.InflaterInputStream;

public class Client {

  /**
   * 讀取檔案內容並壓縮
   *
   * @param filePath 檔案路徑
   * @return 檔案內容
   */
  private static byte[] readFromFileAndCompress(String filePath) {
    // test comment
    int len = -1;
    byte[] buf = new byte[1024];
    try (InputStream input = new BufferedInputStream(new FileInputStream(filePath));
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        DeflaterOutputStream dos = new DeflaterOutputStream(output)) {
      while ((len = input.read(buf)) != -1) {
        dos.write(buf, 0, len);
      }
      return output.toByteArray();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return new byte[0];
  }

}

使用qdox解析

import com.thoughtworks.qdox.JavaProjectBuilder;
import com.thoughtworks.qdox.model.DocletTag;
import com.thoughtworks.qdox.model.JavaClass;
import com.thoughtworks.qdox.model.JavaMethod;
import java.io.File;
import java.io.IOException;
import java.util.Collection;

public class Client {

  public static void main(String[] args) throws IOException {
    JavaProjectBuilder javaProjectBuilder = new JavaProjectBuilder();
    javaProjectBuilder.addSource(new File("D:\\java\\decompile\\Client.java"));
    Collection<JavaClass> classes = javaProjectBuilder.getClasses();
    for (JavaClass aClass : classes) {
      System.out.println("class name: " + aClass.getName());
      for (JavaMethod classMethod : aClass.getMethods()) {
        System.out.println("method name:" + classMethod.getName());
        System.out.println("tags: ");
        for (DocletTag docletTag : classMethod.getTags()) {
          System.out.println("  " + docletTag.getName() + ": " + docletTag.getValue());
        }
        System.out.println("comment: " + classMethod.getComment());
      }
    }
  }

}

輸出為

class name: Client
method name:readFromFileAndCompress
tags: 
  param: filePath 檔案路徑
  return: 檔案內容
comment: 讀取檔案內容並壓縮

獲取了類名稱,方法名稱,方法標籤,方法註釋等資訊。
maven的外掛maven-javadoc-plugin中就使用到了qdox。

參考

【qdox】Java 程式碼解析利器 QDox