从Java源文件中批量榨取注释到设计文档
2007-08-07 09:05
309 查看
现实世界里,很多事情并不定一会按流程发展。软件开发也不例外。很多时候,我们是先写代码(在XP开发中,可能是一个正常现象),再写设计文档的。
如果你的代码中已经有大量的注释(合符Java代码规范的注释),再在设计文档中写一个Class Spec(类说明)表格,是件很痛苦的事情。很快,你就会因没完没了的Copy & Paste而加班。我们是程序员,讲到底,我们的工作其实只有一个目的,让计算机为人类去做重复没趣的事情。
可以通过编写Java Doclet(是不是让你想起Applet/Servelet? 如果不清楚Doclet是什么,参考:http://java.sun.com/j2se/javadoc/)来处理Java 代码中的注释。
目标1:从一大堆源码中榨取类名,与类说明到一个表格中:
Doclet核心代码:
Model类:
Formater类:
用到的组件:
目标2:
源码懒得再描述了,请看附件(http://blog.ccidnet.com/blog.php?do=showone&uid=38493&type=blog&itemid=170794)中的Eclipse project.
如果你的代码中已经有大量的注释(合符Java代码规范的注释),再在设计文档中写一个Class Spec(类说明)表格,是件很痛苦的事情。很快,你就会因没完没了的Copy & Paste而加班。我们是程序员,讲到底,我们的工作其实只有一个目的,让计算机为人类去做重复没趣的事情。
可以通过编写Java Doclet(是不是让你想起Applet/Servelet? 如果不清楚Doclet是什么,参考:http://java.sun.com/j2se/javadoc/)来处理Java 代码中的注释。
目标1:从一大堆源码中榨取类名,与类说明到一个表格中:
Ref | Class name | Description |
1 | com.TestData2 | Hi ListClass |
2 | com.TestData | Hi ListClass |
import org.apache.commons.lang.StringUtils; import com.sun.javadoc.ClassDoc; import com.sun.tools.javadoc.Main; public class Test { /** * Doclet开始方法,将被下面的 main(} 方法间接调用 * * @param root 参见:http://java.sun.com/j2se/1.5.0/docs/guide/javadoc/doclet/spec/index.html?com/sun/javadoc/package-summary.html * @return */ public static boolean start(com.sun.javadoc.RootDoc root) { ClassDoc[] classes = root.classes(); template1.Formater t = new template1.Formater(); t.openFile("./test_output/template1.html"); for (int i = 0; i < classes.length; ++i) {//iterate所有Class Doc(类文档对象) ClassDoc doc = classes[i];//类文档对象 System.out.println("***" + classes[i]); if( StringUtils.isEmpty( doc.commentText() ) ) {//类注释为空 continue; } Model model = new Model( Integer.toString( i + 1 ), doc.qualifiedName(),//类全名 doc.commentText()//类注释 ); t.insertClass( model ); } t.closeFile(); return true; } public static void main(String [] arg) { System.out.println("Test"); Main.execute("javadoc", Test.class.getName(), new String[]{ "-private", "-sourcepath", "./test_data",//源文件位置 "-subpackages", "com",//要处理的package name }); } } |
public class Model { private String ref; private String className; private String desc; public String getRef() { return ref; } public void setRef(String ref) { this.ref = ref; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public Model() { super(); } public Model(String ref, String className, String desc) { super(); this.ref = ref; this.className = className; this.desc = desc; } } |
public class Formater { StringTemplateGroup group = new StringTemplateGroup( "myGroup" ); private Writer w; public void openFile(String file) { try { w = new FileWriter( file ); //write head InputStream in = this.getClass().getResourceAsStream( "/template1/docHead.html" ); String head = IOUtils.toString( in ); IOUtils.closeQuietly( in ); w.write( head ); } catch (IOException e) { throw new RuntimeException( e ); } } public void closeFile() { try { //write foot InputStream in = this.getClass().getResourceAsStream( "/template1/docFoot.html" ); String foot = IOUtils.toString( in ); IOUtils.closeQuietly( in ); w.write( foot ); } catch (IOException e) { throw new RuntimeException( e ); } IOUtils.closeQuietly( w ); } public void insertClass(Model model) { try { w.write( formatClass( model ) ); } catch (IOException e) { throw new RuntimeException( e ); } } public String formatClass(Model model) { StringTemplate template = group.getInstanceOf( "template1/rec" ); template.reset(); template.setAttribute( "model", model ); return template.toString(); } } |
目标2:
Analysis Class Name | TestData2 |
Package Name | com |
Modifier | public |
Type | Class |
Description | Hi ListClass |
Attribute Name | Modifier | Attribute Type | *Default Value | Description |
v | private | java.lang.StringBuffer | - | The v.Hi the v |
p | private | java.lang.StringBuffer | - | The p.Hi the p |
Operation | start | |
Modifier | public static | |
Operation Description | start method | |
Return Result | boolean | |
Throws | java.lang.Exception | |
Owned Parameter Name | Owned Parameter Type | Owned Parameter Description |
root | com.sun.javadoc.RootDoc | the root hi root |
Analysis Class Name | TestData |
Package Name | com |
Modifier | public |
Type | Class |
Description | Hi ListClass |
Attribute Name | Modifier | Attribute Type | *Default Value | Description |
v | private | java.lang.StringBuffer | - | The v.Hi the v |
p | private | java.lang.StringBuffer | - | The p.Hi the p |
Operation | start | |
Modifier | public static | |
Operation Description | start method | |
Return Result | boolean | |
Throws | java.lang.Exception | |
Owned Parameter Name | Owned Parameter Type | Owned Parameter Description |
root | com.sun.javadoc.RootDoc | the root hi root |
相关文章推荐
- 黑马程序员——Java基础之面向对象(二)文档注释与设计模式
- Java 注释和嵌入式文档
- java文档注释
- 知识学习——Java文档注释
- JAVA 文档注释
- 如何写Java文档注释(Java Doc Comments)
- 票据打印, 银行账单打印, 标签印刷, 文档打印, 条码打印, 批量打印, 包装纸打印与设计,可变数据打印,数据库印刷,HMI报表打印,VC++源码库解决方案
- 《Java 编程思想》003 Java注释和嵌入式文档
- Eclipse中如何修改Java代码注释的样式和如何提取出注释文档
- java文档注释
- Java_26_API文档_注释_package的概念
- Java 批量删除html中注释内容的方法
- java学习笔记(四)----对象、数组作为参数传递,静态变量、静态方法的使用,内部类,使用文档注释
- java文档注释
- Java 文档注释
- 基于Java的简单数据库设计生成工具(生成Excel文档)
- Java中合并XML文档的设计与实现
- CYQ.DBImport 数据库反向工程及批量导数据库工具 V2.0 发布[增加批量导出数据库脚本及数据库设计文档]
- Java菜鸟学习笔记--配置篇(三):Java API 文档下载与文档注释的使用
- java文档注释主要使用方法