QDox笔记

    技术2022-05-11  66

    好像没有人写这个文章

    QDox是用来解析java源代码的  有时也可以替代JavaDoc

    简单说说用法(根据官方文档http://qdox.codehaus.org)

    入口点

    JavaDocBuilder 是QDocx的入口点 负责解析源代码 导入和储存只需要创建默认的构造函数JavaDocBuilder builder = new JavaDocBuilder()

    读取源文件 // Reading a single source file.builder.addSource(new FileReader("MyFile.java"));

    // Reading from another kind of input stream.builder.addSource(new StringReader("package test; public class Hello {}"));

    // Adding all .java files in a source tree (recursively).builder.addSourceTree(new File("mysrcdir"));

    解析类名在解析之前要把class里的import的类导入进来有三种方法来导入类库 1 用已经加入进来的资源包 2 当前的环境变量 3 额外指定的类库前两种是由JavaDocBuilder自动设置第三种方法的例子// Get the ClassLibraryClassLibrary lib = builder.getClassLibrary();

    // Add a custom ClassLoaderlib.addClassLoader(myCustomClassLoader);

    // Ant example : add the <classpath> element's contentslib.addClassLoader(new AntClassLoader(getProject(), classpath));

    操作源代码模型在被解析之后就可以非常直观的分析对象模型

     一 JavaSource

    例如有这样的一个Class

     

    package com.ergal.test;import java.awt. * ;import java.util.List; public   class  Test  {  } class  Class2  {} interface  Interface1  {}

    现在可以写一个类来读取

    package  com.ergal.test; import  java.io.FileNotFoundException; import  java.io.FileReader; import  com.thoughtworks.qdox.JavaDocBuilder; import  com.thoughtworks.qdox.model.JavaClass; import  com.thoughtworks.qdox.model.JavaSource; public   class  PraseJavaSource  {        public static void main(String[] args) throws FileNotFoundException{        JavaDocBuilder builder = new JavaDocBuilder();        builder.addSource(new FileReader("D:/Development/workspace/test/src/com/ergal/test/Test.java"));        JavaSource src = builder.getSources()[0];        String pkg       = src.getPackage(); // "com.blah.foo"        String[] imports = src.getImports(); // {"java.awt.*",                                             //  "java.util.List"}        JavaClass class1     = src.getClasses()[0];        JavaClass class2     = src.getClasses()[1];        JavaClass interface1 = src.getClasses()[2];                System.out.println(pkg);            }}

     

    这样源代码里的一些包和类名都可以得到

     

    二 JavaClass

     

    package  com.ergal.test; import  java.awt. * ; import  java.util.List; import  java.io. * ; /** * @author ergal */ public   abstract   class  Test  extends  SubClass             implements  Serializable, CustomInterface   {  private String name;  private int number;    public void doStuff() {  }  private int getNumber() {      return this.number;  }}

    解析

    package  com.ergal.test; import  java.io.FileNotFoundException; import  java.io.FileReader; import  com.thoughtworks.qdox.JavaDocBuilder; import  com.thoughtworks.qdox.model.JavaClass; import  com.thoughtworks.qdox.model.JavaField; import  com.thoughtworks.qdox.model.JavaMethod; import  com.thoughtworks.qdox.model.JavaSource; import  com.thoughtworks.qdox.model.Type; public   class  PraseJavaSource  {        public static void main(String[] args) throws FileNotFoundException{        JavaDocBuilder builder = new JavaDocBuilder();        builder.addSource(new FileReader("D:/Development/workspace/test/src/com/ergal/test/Test.java"));                /**        JavaSource src = builder.getSources()[0];        String pkg       = src.getPackage(); // "com.blah.foo"        String[] imports = src.getImports(); // {"java.awt.*",                                             //  "java.util.List"}        JavaClass class1     = src.getClasses()[0];        JavaClass class2     = src.getClasses()[1];        JavaClass interface1 = src.getClasses()[2];                System.out.println(pkg);        */                JavaClass cls=builder.getClasses()[0];        String pkg=cls.getPackage();        System.out.println("package : "+pkg);                String className=cls.getName();        System.out.println("classname : "+className);                String fullName = cls.getFullyQualifiedName();        System.out.println("classFullName : "+fullName);                boolean isInterface = cls.isInterface();        System.out.println("isInterface : "+isInterface);                boolean isPublic   = cls.isPublic();        System.out.println("isPublic : "+isPublic);                boolean isAbstract = cls.isAbstract();         System.out.println("isAbstract : "+isAbstract);                boolean isFinal    = cls.isFinal();         System.out.println("isFinal : "+isFinal);        Type superClass = cls.getSuperClass();         System.out.println("superClass : "+superClass);                Type[] imps     = cls.getImplements();        System.out.println("interface 1 : "+imps[0].getValue());        System.out.println("interface 2 : "+imps[1].getValue());        String author = cls.getTagByName("author").getValue();         System.out.println("author 2 : "+author);                     JavaField nameField = cls.getFields()[0];        System.out.println("nameField : "+nameField.getComment());                JavaMethod doStuff = cls.getMethods()[0];        System.out.println("doStuff : "+doStuff.getComment());                JavaMethod getNumber = cls.getMethods()[1];        System.out.println("getNumber : "+getNumber.getComment());            }}

      

    未完.....


    最新回复(0)