| Refresh | Home EGTry.com

use doclet to extract class, field, method information from java source code


file structure

run1.bat
src/egtry/doclet/PrintClass.java
                example/Simple.java

classes/egtry/doclet/PrintClass.class


run1.bat

javadoc -docletpath classes -doclet egtry.doclet.PrintClass src/egtry/doclet/example/Simple.java


Target Source file Simple.java

package egtry.doclet.example;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


public class Simple extends ArrayList implements Serializable, Comparable {

	private int a=10;
	private String[] argv;
	static final String NAME="test";
	
	public Simple() {
		
	}
	
	public Simple(Date date) {
		
	}
	
	public Simple(Date date, String name) {
		
	}
	
	public void service(List<String> list) throws Exception {
		throw new Exception("some error");
	}
	
	public static void main(String[] args) {


	}

	@Override
	public int compareTo(Object obj) {
		return 0;
	}

}


Output

C:\my1\projects\JavaAppEngine\ConsoleExample>javadoc -docletpath classes -doclet egtry.doclet.PrintClass src/egtry/doclet/example/Simple.java 
Loading source file src/egtry/doclet/example/Simple.java...
Constructing Javadoc information...
egtry.doclet.example.Simple, Simple, egtry.doclet.example
fields: 3
package egtry.doclet.example;

public class Simple extends java.util.ArrayList implements java.io.Serializable,java.lang.Comparable{

  private int a;

  private java.lang.String[] argv;

   static final java.lang.String NAME;

public Simple(){
}

public Simple(java.util.Date date){
}

public Simple(java.util.Date date,java.lang.String name){
}

public void service(java.util.List list) throws java.lang.Exception{}

public void main(java.lang.String[] args){}

public int compareTo(java.lang.Object obj){}
}




Doclet class PrintClass.java

package egtry.doclet;
import java.io.PrintWriter;
import java.io.StringWriter;

import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.ConstructorDoc;
import com.sun.javadoc.Doc;
import com.sun.javadoc.ExecutableMemberDoc;
import com.sun.javadoc.FieldDoc;
import com.sun.javadoc.MethodDoc;
import com.sun.javadoc.Parameter;
import com.sun.javadoc.ProgramElementDoc;
import com.sun.javadoc.RootDoc;
import com.sun.javadoc.Type;


public class PrintClass {
	private static StringWriter buff=new StringWriter();
	private static PrintWriter out=new PrintWriter(buff);
	
	public static boolean start(RootDoc rootDoc) {
		ClassDoc[] classes=rootDoc.specifiedClasses();
		if (classes.length>0) {
			printClass(classes[0]);
		}
		return true;
	}
	
	public static void printClass(ClassDoc classDoc) {
		//package names
		String qualifiedName=classDoc.qualifiedName();
		String name=classDoc.simpleTypeName();
		String packageName;
		if (qualifiedName.equals(name)) {
			packageName="";
		} else {
			int lastDot=qualifiedName.lastIndexOf('.');
			packageName=qualifiedName.substring(0, lastDot);
		}
		System.out.println(qualifiedName+", "+name+", "+packageName);
		out.println("package "+packageName+";");

		
		//class 
		out.print("\n"+getAccess(classDoc));

		out.print(" class");
		out.print(" "+classDoc.name());
		//extends
		String superClassName=classDoc.superclass().qualifiedName();
		if (!superClassName.equals("java.lang.Object")) {
			out.print(" extends "+superClassName);
		}
		//implements
		ClassDoc[] interfaces=classDoc.interfaces();
		if (interfaces!=null && interfaces.length>0) {
			out.print(" implements");
			for(int i=0; i<interfaces.length; i++) {
				if (i==0) {
					out.print(" "+interfaces[i].qualifiedName());
				} else {
					out.print(","+interfaces[i].qualifiedName());
				}
			}
		}
		
		out.println("{");
		//fields
		FieldDoc[] fields=classDoc.fields(false);
		System.out.println("fields: "+fields.length);
		for(int i=0; i<fields.length; i++) {
			out.println();
			printField(fields[i]);
		}
		
		//constructor
		ConstructorDoc[] constructors=classDoc.constructors(false);
		for(int i=0; i<constructors.length; i++) {
			out.println();
			printConstructor(constructors[i]);
		}
		
		//methods
		MethodDoc[] methodDocs=classDoc.methods(false);
		for(int i=0; i<methodDocs.length; i++) {
			out.println();
			printMethod(methodDocs[i]);
		}
		
		
		out.println("}");
		
		System.out.println(buff.toString());
	}

	
	public static void printField(FieldDoc field) {
		out.print("  ");
		out.print(getAccess(field));

		
		if (field.isStatic()) {
			out.print(" static");
		}
		
		if (field.isFinal()) {
			out.print(" final");
		}
		
		out.print(" "+field.type());
		out.print(" "+field.name());
		out.println(";");
	}
	
	public static void printConstructor(ConstructorDoc cDoc) {
		out.print(getAccess(cDoc));
		out.print(" "+cDoc.name());
		
		//arguments
		printArgv(cDoc);
		printThrows(cDoc);
		
		out.println("{");
		out.println("}");
		
	}
	
	public static void printMethod(MethodDoc mDoc) {
		out.print(getAccess(mDoc));
		out.print(" "+mDoc.returnType());
		out.print(" "+mDoc.name());
		printArgv(mDoc);
		printThrows(mDoc);
		
		out.println("{}");
	}
	
	public static void printThrows(ExecutableMemberDoc doc) {
		ClassDoc[] exceptions=doc.thrownExceptions();
		for(int i=0; i<exceptions.length; i++) {
			if (i==0) {
				out.print(" throws "+exceptions[i].qualifiedName());
			} else {
				out.print(", "+exceptions[i].qualifiedName());
			}
		}
	}
	
	public static void printArgv(ExecutableMemberDoc doc) {
		out.print("(");
		Parameter[] argv=doc.parameters();
		for(int i=0; i<argv.length; i++) {
			Parameter p=argv[i];
			if (i==0) {
				out.print(p.type()+" "+p.name());
			} else {
				out.print(","+p.type()+" "+p.name());
			}
		}
		out.print(")");
	}
	
	public static String getAccess(ProgramElementDoc doc) {
		if (doc.isPublic()) {
			return "public";
		} else if (doc.isProtected()) {
			return "protected";
		} else if (doc.isPrivate()) {
			return "private";
		} else {
			return "";
		}
	}
}