使用JavaParser从源文件中提取JavaDoc文档

很多人正在使用JavaParser实现最不同的目标。 其中之一是提取文档。 在这篇简短的文章中,我们将看到如何打印与类或接口关联的所有JavaDoc注释。

可以在GitHub上找到代码: https : //github.com/ftomassetti/javadoc-extractor

获取类的所有Javadoc注释

我们正在重用DirExplorer,在提出了支持类的介绍JavaParser类 。 此类允许递归处理目录,解析其中包含的所有Java文件。

我们可以从遍历所有类开始,然后找到相关的Javadoc注释。

/*** Iterate over the classes and print their Javadoc.*/
public class ClassesJavadocExtractor {public static void main(String[] args) {File projectDir = new File("source_to_parse/");new DirExplorer((level, path, file) -> path.endsWith(".java"), (level, path, file) -> {try {new VoidVisitorAdapter<Object>() {@Overridepublic void visit(ClassOrInterfaceDeclaration n, Object arg) {super.visit(n, arg);if (n.getComment() != null && n.getComment() instanceof JavadocComment) {String title = String.format("%s (%s)", n.getName(), path);System.out.println(title);System.out.println(Strings.repeat("=", title.length()));System.out.println(n.getComment());}}}.visit(JavaParser.parse(file), null);} catch (IOException e) {new RuntimeException(e);}}).explore(projectDir);}}

如您所见,获取JavaDoc注释非常容易。 它产生以下结果:

ASTParserConstants (/javaparser/javaparser-core/target/generated-sources/javacc/com/github/javaparser/ASTParserConstants.java)
==============================================================================================================================
/*** Token literal values and constants.* Generated by org.javacc.parser.OtherFilesGen#start()*/ParseException (/javaparser/javaparser-core/target/generated-sources/javacc/com/github/javaparser/ParseException.java)
======================================================================================================================
/*** This exception is thrown when parse errors are encountered.* You can explicitly create objects of this exception type by* calling the method generateParseException in the generated* parser.** You can modify this class to customize your error reporting* mechanisms so long as you retain the public fields.*/ASTParser (/javaparser/javaparser-core/target/generated-sources/javacc/com/github/javaparser/ASTParser.java)
============================================================================================================
/***
This class was generated automatically by javacc, do not edit.*/ ASTParserTokenManager (/javaparser/javaparser-core/target/generated-sources/javacc/com/github/javaparser/ASTParserTokenManager.java) ==================================================================================================================================== /** Token Manager. */

获取所有Javadoc注释并找到记录的元素

在其他情况下,我们可能要开始收集所有Javadoc注释,然后找到要注释的元素。 我们也可以使用Javaparser轻松做到这一点:

/*** Iterate over all the Javadoc comments and print them together with a description of the commented element.*/
public class AllJavadocExtractor {public static void main(String[] args) {File projectDir = new File("source_to_parse/");new DirExplorer((level, path, file) -> path.endsWith(".java"), (level, path, file) -> {try {new VoidVisitorAdapter<Object>() {@Overridepublic void visit(JavadocComment comment, Object arg) {super.visit(comment, arg);String title = null;if (comment.getCommentedNode().isPresent()) {title = String.format("%s (%s)", describe(comment.getCommentedNode().get()), path);} else {title = String.format("No element associated (%s)", path);}System.out.println(title);System.out.println(Strings.repeat("=", title.length()));System.out.println(comment);}}.visit(JavaParser.parse(file), null);} catch (IOException e) {new RuntimeException(e);}}).explore(projectDir);}private static String describe(Node node) {if (node instanceof MethodDeclaration) {MethodDeclaration methodDeclaration = (MethodDeclaration)node;return "Method " + methodDeclaration.getDeclarationAsString();}if (node instanceof ConstructorDeclaration) {ConstructorDeclaration constructorDeclaration = (ConstructorDeclaration)node;return "Constructor " + constructorDeclaration.getDeclarationAsString();}if (node instanceof ClassOrInterfaceDeclaration) {ClassOrInterfaceDeclaration classOrInterfaceDeclaration = (ClassOrInterfaceDeclaration)node;if (classOrInterfaceDeclaration.isInterface()) {return "Interface " + classOrInterfaceDeclaration.getName();} else {return "Class " + classOrInterfaceDeclaration.getName();}}if (node instanceof EnumDeclaration) {EnumDeclaration enumDeclaration = (EnumDeclaration)node;return "Enum " + enumDeclaration.getName();}if (node instanceof FieldDeclaration) {FieldDeclaration fieldDeclaration = (FieldDeclaration)node;List<String> varNames = fieldDeclaration.getVariables().stream().map(v -> v.getName().getId()).collect(Collectors.toList());return "Field " + String.join(", ", varNames);}return node.toString();}}

在这里,大多数代码都是关于为注释节点提供描述的(方法describe )。

结论

操作AST并找到Javadoc注释非常容易。 但是,缺少的一项功能是可以以结构化形式提取Javadoc中包含的信息。 例如,您可能只想获取与某个参数或返回值关联的Javadoc部分。 Javaparser当前不具有此功能,但是我正在研究此功能,应该在接下来的1-2周内将其合并。 如果要关注开发,请查看问题433 。

感谢您的阅读和愉快的解析!

翻译自: https://www.javacodegeeks.com/2017/01/extracting-javadoc-documentation-source-files-using-javaparser.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三个打印函数printf()/sprintf()/snprintf()区别

先贴上其函数原型 printf( const char *format, ...) 格式化输出字符串&#xff0c;默认输出到终端-----stdout sprintf(char *dest, const char *format,...) 格式化输出字符串到指定的缓冲区 snprintf(char *dest, size_t size,const char *format,...) 按指定的S…

JAVA客户端数据传输_java模拟TCP通信实现客户端上传文件到服务器端

java模拟TCP通信实现客户端上传文件到服务器端&#xff0c;供大家参考&#xff0c;具体内容如下客户端package com.zr;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import jav…

js闭包简单演示

function f1() { var age 20; var height 170; function f2() { console.log("aaa:"(age) "--bbb:"height); } return f2; } var ff f1(); var fa f1(); fa(); fa(); ff(); ff(); 这里有两个闭包&#xff0c;fa和ff分别保存的信息独立&#xff0c;age…

C++ 类成员引用变量的使用

出来工作后&#xff0c;才发现原来C的类成员变量可以是引用变量。下面通过一个例子来说明&#xff08;虽然没多大意义&#xff09;&#xff1a; #include <iostream> using namespace std; class A { public: A(int i3):m_i(i){} void print() { c…

java 课程设计表达式求值_NYOJ-35-表达式求值

NYOJ-35-表达式求值很好的一题&#xff0c;利用栈来计算表达式的值四则运算的规则&#xff1a;1.先乘除,后加减&#xff1b;2.从左算到右&#xff1b;3.先括号内,后括号外注意把字符串转换成浮点数可以使用atof函数#include#include#includeint map[7][7] //算符间的优先关系,1…

打破冷漠僵局文章_研究僵局–第3部分

打破冷漠僵局文章在本系列的前两个博客&#xff08; 第1部分和第2部分&#xff09;中 &#xff0c;我演示了如何创建一段会死锁的错误代码&#xff0c;然后使用该代码演示进行线程转储的三种方式。 在此博客中&#xff0c;我将分析线程转储以找出错误的原因。 下面的讨论同时涉…

springboot 静态资源访问,和文件上传 ,以及路径问题

springboot 静态资源访问: 这是springboot 默认的静态资源访问路径 访问顺序依次从前到后&#xff08;http://localhost:8080/bb.jpg&#xff09; spring.resources.static-locations classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/p…

mysql jdbc链接配置文件_Java JDBC使用配置文件连接数据库

Java JDBC使用配置文件连接数据库&#xff1a;创建后缀名为&#xff1a;.properties的文件&#xff0c;文件内容包括&#xff0c;数据库驱动、连接的数据库地址、用户名、密码……以Mysql为例创建config.properties配置文件其内容如下&#xff1a;DRIVER_CLASScom.mysql.jdbc.D…

单例模式(饿汉式和懒汉式)

以前学习单例的时候&#xff0c;只理解了简单部分。这次看DRP&#xff0c;对单例的饿汉式和懒汉式有了一些认识和对比。 在实际的开发中&#xff0c;有些地方需要一个类只有一个实例。比如&#xff1a;网站在线人数的计数器&#xff0c;再比如IDE中的工具箱之类的等等。当需要这…

关于前端设置cookie

cookie既可以后端设置也可以在前端设置&#xff0c;例如登陆/注册功能&#xff0c;每次都要向服务器请求用户数据&#xff0c;这种就可以把cookie放到前端储存起来。 当网页要发http请求时&#xff0c;浏览器会先检查是否有相应的cookie&#xff0c;有则自动添加在request head…

使用React,Spring Boot和用户身份验证构建CRUD应用程序

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; React是用于创建Web应用程序前端的最…

java基本数据类型所占长度_java基本数据类型长度详解

java基本数据类型基础知识机器数和真值机器数一个数在计算机中的二进制表示形式,叫做这个数的机器数机器数是带符号的&#xff0c;在计算机用一个数的最高位存放符号, 正数为0, 负数为1例如:dec 3 bit 00000011dec -3 bit 10000011真值将带符号位的机器数对应的真正数值称为机…

解释型语言和编译型语言的区别

解释型语言和编译型语言的区别 首先&#xff0c;我们编程都是用的高级语言(写汇编和机器语言的大牛们除外)&#xff0c;计算机不能直接理解高级语言&#xff0c;只能理解和运行机器语言&#xff0c;所以必须要把高级语言翻译成机器语言&#xff0c;计算机才能运行高级语言所编写…

解决tomcat中文传输乱码问题

<Connector URIEncoding"utf-8" connectionTimeout"20000" encoding"utf-8" port"8080" protocol"HTTP/1.1" redirectPort"8443"/> 在server.xml中找到这句即可&#xff0c;加上URIEncodingUTF-8即可。转载…

关于java结构中描述正确的是_下列关于Java中类的构造方法的描述,正确的是()...

A&#xff1a;构造函数没有返回值&#xff0c;也不能用void修饰。如果不小心给构造函数前面添加了返回值类型&#xff0c;那么这将使这个构造函数变成一个普通的方法&#xff0c;在运行时将产生找不到构造方法的错误。C&#xff1a;super(参数)&#xff1a;调用父类中的某一个构…

如何合理地估算线程池大小?

如何合理地估算线程池大小&#xff1f; 这个问题虽然看起来很小&#xff0c;却并不那么容易回答。大家如果有更好的方法欢迎赐教&#xff0c;先来一个天真的估算方法&#xff1a;假设要求一个系统的TPS&#xff08;Transaction Per Second或者Task Per Second&#xff09;至少为…

使用Arquillian,Docker和Selenium使Web UI测试再次变得出色(第1部分)

问题简介 大多数时候&#xff0c;当您需要为Web UI编写功能测试/端到端测试时&#xff0c;您最终会使用Selenium &#xff0c;它可以被视为Java世界中用于Web UI测试的事实上的工具。 我确定您已经将其用于此类测试。 但是可能同时&#xff0c;您遇到了功能测试中一些最常见的…

os sys hashlib

os模块 os模块是与操作系统交互的一个接口​ ?123456789101112131415161718192021222324252627282930313233343536<em>#和文件夹相关os.makedirs(dirname1/dirname2) 可生成多层递归目录os.removedirs(dirname1) 若目录为空&#xff0c;则删除&#xff0c;并递归到…

mysql 打包 脚本_windows下mysql自动备份压缩打包时间命名批处理脚本

我在此文章上做修改&#xff1a;把时间修改成不记录小时分和秒  新建一个名字后缀为“。bat”的文件  set d%date:~0,10%  set d%d:-%  set t%time:~0,8%  set t%t::%  set dzxpathmysql%p%%d%.sql  set ucpathuc%p%%d%%t%.sql  set folderd:\test\  echo of…

java sql 登录失败_java – 接收连接到SQL Server 2008的SQLException“用户登录失败”

我试图通过Java连接到SQL Server 2008.>我已将sqljdbc4.jar添加到我的项目库中.>没有为访问数据库的数据库设置用户名和密码(Windows身份验证).> 1433端口正在侦听,但我仍然收到此异常&#xff1a;SQL Exception: com.microsoft.sqlserver.jdbc.SQLServerException: L…