好像没有人写这个文章
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()); }}
未完.....