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

 

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());
        
    }


}

  

未完.....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值