QDox笔记

好像没有人写这个文章

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

packagecom.ergal.test;

importjava.awt.
* ;
importjava.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 ... {
publicstaticvoidmain(String[]args)throwsFileNotFoundException...{
JavaDocBuilderbuilder
=newJavaDocBuilder();
builder.addSource(
newFileReader("D:/Development/workspace/test/src/com/ergal/test/Test.java"));

JavaSourcesrc
=builder.getSources()[0];

Stringpkg
=src.getPackage();//"com.blah.foo"
String[]imports=src.getImports();//{"java.awt.*",
//"java.util.List"}

JavaClassclass1
=src.getClasses()[0];
JavaClassclass2
=src.getClasses()[1];
JavaClassinterface1
=src.getClasses()[2];

System.out.println(pkg);


}


}

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

二 JavaClass

package com.ergal.test;

import java.awt. * ;
import java.util.List;

import java.io. * ;


/***/ /**
*
@authorergal
*/

public abstract class Test extends SubClass
implements Serializable,CustomInterface ... {

privateStringname;
privateintnumber;

publicvoiddoStuff()...{
}

privateintgetNumber()...{
returnthis.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 ... {
publicstaticvoidmain(String[]args)throwsFileNotFoundException...{
JavaDocBuilderbuilder
=newJavaDocBuilder();
builder.addSource(
newFileReader("D:/Development/workspace/test/src/com/ergal/test/Test.java"));

/***//**
JavaSourcesrc=builder.getSources()[0];

Stringpkg=src.getPackage();//"com.blah.foo"
String[]imports=src.getImports();//{"java.awt.*",
//"java.util.List"}

JavaClassclass1=src.getClasses()[0];
JavaClassclass2=src.getClasses()[1];
JavaClassinterface1=src.getClasses()[2];

System.out.println(pkg);
*/


JavaClasscls
=builder.getClasses()[0];
Stringpkg
=cls.getPackage();
System.out.println(
"package:"+pkg);

StringclassName
=cls.getName();
System.out.println(
"classname:"+className);

StringfullName
=cls.getFullyQualifiedName();
System.out.println(
"classFullName:"+fullName);

booleanisInterface=cls.isInterface();
System.out.println(
"isInterface:"+isInterface);

booleanisPublic=cls.isPublic();
System.out.println(
"isPublic:"+isPublic);

booleanisAbstract=cls.isAbstract();
System.out.println(
"isAbstract:"+isAbstract);

booleanisFinal=cls.isFinal();
System.out.println(
"isFinal:"+isFinal);

TypesuperClass
=cls.getSuperClass();
System.out.println(
"superClass:"+superClass);

Type[]imps
=cls.getImplements();
System.out.println(
"interface1:"+imps[0].getValue());
System.out.println(
"interface2:"+imps[1].getValue());

Stringauthor
=cls.getTagByName("author").getValue();
System.out.println(
"author2:"+author);

JavaFieldnameField
=cls.getFields()[0];
System.out.println(
"nameField:"+nameField.getComment());

JavaMethoddoStuff
=cls.getMethods()[0];
System.out.println(
"doStuff:"+doStuff.getComment());

JavaMethodgetNumber
=cls.getMethods()[1];
System.out.println(
"getNumber:"+getNumber.getComment());

}


}

未完.....

你可能感兴趣的:(笔记)