好像没有人写这个文章
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 ClassLibrary
ClassLibrary lib = builder.getClassLibrary();
// Add a custom ClassLoader
lib.addClassLoader(myCustomClassLoader);
// Ant example : add the <classpath> element's contents
lib.addClassLoader(new AntClassLoader(getProject(), classpath));
操作源代码模型
在被解析之后就可以非常直观的分析对象模型
一 JavaSource
例如有这样的一个Class
import java.awt. * ;
import java.util.List;
public class Test ... {
}
class Class2 ... {
}
interface Interface1 ... {
}
现在可以写一个类来读取
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
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;
}
}
解析
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());
}
}
未完.....