JavaParse入门_爱吃鱼的简大Boss的博客-程序员秘密

技术标签: jvm  java  servlet  Java基础  

需求

工作时有需求获取java文件成员变量的注释,故而研究了一系列开源产品,之所以选择JavaParse,是因为博客上文件比较多。。。

多归多,但也版本杂乱,走了不少歪路。

版本2.x和版本3.x还是有较大不同的,有需要的人可以参考。

版本2.x

<!-- https://mvnrepository.com/artifact/com.github.javaparser/javaparser-core -->
<dependency>
	<groupId>com.github.javaparser</groupId>
	<artifactId>javaparser-core</artifactId>
	<version>2.2.1</version>
</dependency>
package cn.com.infosec.netseal.webserver.util;

import cn.com.infosec.netseal.common.util.StringUtils;
import com.github.javaparser.JavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.TypeDeclaration;
import com.github.javaparser.ast.comments.Comment;

import java.io.File;
import java.util.List;

public class JavaParseTest {
    
    public static void main(String[] args) throws Exception {
    
        String classPath = "E:\\Idea\\NetSeal\\v7\\src\\netseal\\netseal-common\\src\\main\\java\\cn\\com\\infosec\\netseal\\common\\resource\\errCode\\ErrSubType.java";
        String mapName = "subTypeMap";

        CompilationUnit parse = JavaParser.parse(new File(classPath));

        // 获取指定文件中的所有类
        List<TypeDeclaration> types = parse.getTypes();
        for (TypeDeclaration type : types) {
    
            // 获取类名/类注释
            String className = type.getName();
            type.getComment();

            // 获取类里的变量、方法等子节点
            List<Node> list = type.getChildrenNodes();
            System.out.println("总个数:" + list.size());
            for (Node node : list) {
    
                if (node.toString().indexOf("(") != -1)
                    continue;

                // 获取变量的类型、变量名称和变量值;
                List<Node> varTypeAndKV = node.getChildrenNodes();
                Node varKV = varTypeAndKV.get(1);
                String varK = varKV.toString().split("=")[0].trim();

                // 获取变量注释
                String content = "";
                Comment comment = node.getComment();
                if (comment != null && comment.getContent() != "") {
    
                    content = comment.getContent().replace("*", "").trim();
                }

                System.out.println(StringUtils.format("{}.put({}.{}, \"{}\");", mapName, className, varK, content));

            }
        }

    }
}

版本3.x

<dependency>
	<groupId>com.github.javaparser</groupId>
	<artifactId>javaparser-core</artifactId>
	<version>3.6.16</version>
	<scope>compile</scope>
</dependency>
package cn.com.infosec.netseal.appserver.util;

import cn.com.infosec.netseal.common.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.github.javaparser.JavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.FieldDeclaration;
import com.github.javaparser.ast.body.TypeDeclaration;
import com.github.javaparser.ast.body.VariableDeclarator;
import com.github.javaparser.ast.comments.Comment;
import com.github.javaparser.ast.expr.SimpleName;

import java.io.File;
import java.util.List;
import java.util.Optional;

public class JavaParseTest {
    
    public static void main(String[] args) throws Exception {
    
        String classPath = "E:\\Idea\\NetSeal\\v7\\src\\netseal\\netseal-common\\src\\main\\java\\cn\\com\\infosec\\netseal\\common\\resource\\errCode\\ErrSubType.java";
        String mapName = "subTypeMap";

        CompilationUnit parse = JavaParser.parse(new File(classPath));

        Optional<ClassOrInterfaceDeclaration> errSubType = parse.getClassByName("ErrSubType");

        errSubType.ifPresent((c) -> {
    
            // 获取类名/类注释
            String className = c.getName().toString();
            c.getComment();

            // 获取类里的变量、方法等子节点
            List<Node> list = c.getChildNodes();
            System.out.println("总个数:" + list.size());
            for (Node nodeTmp : list) {
    
                if (!(nodeTmp instanceof FieldDeclaration))
                    continue;

                FieldDeclaration node = (FieldDeclaration) nodeTmp;

                // 获取变量的类型、变量名称和变量值;
                VariableDeclarator variable = node.getVariable(0);
                String  varName = variable.getNameAsString();
                String  varType = variable.getTypeAsString();

                // 获取变量注释
                String content = "";
                Optional<Comment> comment = node.getComment();
                if (comment != null && comment.get().getContent() != "") {
    
                    content = comment.get().getContent().replace("*", "").trim();
                }

                System.out.println(StringUtils.format("{}.put({}.{}, \"{}\");", mapName, className, varName, content));

            }
        });

    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42873640/article/details/126230801

智能推荐

linux内核tcp的定时器管理(二)_black_berry的博客-程序员秘密

linux内核tcp的定时器管理(二) 博客分类:kernelLinux应用服务器网络应用网络协议Blog这次我们来看后面的3个定时器; 首先是keep alive定时器。 这个定时器主要是由于一条连接可能长时间idle,此时就需要发送探测包,

访问assets中文件各种文件的方法_啤丶酒的博客-程序员秘密

可以通过这个方法来找到是否有你要的那个文件:String[] list = null;list = getResources().getAssets().list("abc");它返回的是在assets文件夹下abc文件夹中文件的文件名的列表。再去检查list中是否有你需要的文件。读取abc文件夹中的文件的时候只需:InputStream in = getResources().getAssets

pta算法:计算天数_输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别_半浮名的博客-程序员秘密

输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。不是就是28天,

FLEX源码分析_allanGold的博客-程序员秘密

FLEX 2.0源码分析(一)https://www.jianshu.com/p/8bc4c5f4b19fFLEX源码分析二(网络监测swizzle)https://www.jianshu.com/p/ffb95f2cbda6FLEX源码分析三(网络监测记录FLEXNetworkRecorder)https://www.jianshu.com/p/66267dc922c5F...

Flink实战3-数据实时写入HBase的Sink方式_flink hbase sink_Kevin_鹿的博客-程序员秘密

背景接入Kafka实时数据经过数据处理写入HBase,后续会应用于类似变量系统以及实时日志中,对于变量系统这类中间需要做实时缓存宽表可能使用HBase连接极其频繁,所以是使用客户端还是Sink的方式就看实际情况而定,具体数据处理后的落库Sink还是比较方便的;摘要关键字Flink,Sink,HBase,数据处理,数据流转设计使用的是Max Well数据源,将业务数据接入Kafka,Flink-Source接入Kafka,中间经过数据流转将数据存储到HBase作实时表;实现说明

Docker——idea安装docker插件将镜像推送到阿里云镜像仓库_北巷远人的博客-程序员秘密

一、使用idea的docker插件推送镜像到阿里云镜像仓库1、idea中下载docker插件:Settings -&gt; Plugins -&gt; Docker2、添加docker基本构建镜像配置Edit Configurations -&gt; Templates -&gt; Docker -&gt; Add New Configuration(添加按钮) -&gt; DockerFile填写Name -&gt; Dockerfile -&gt; Image tag -&.

随便推点

逆向工程核心原理——代码注入_正在过坎的博客-程序员秘密

什么是代码注入?代码注入是一种向目标进程插入独立运行代码并使之运行的技术,它一般调用CreateRemoteThread()API以远程线程形式运行插入的代码,所以也被称为线程注入。使用代码注入的原因其实,代码注入要实现的功能与DLL注入类似,但具体实施时要考虑的事项更多,使用起来 更加不便。那它的优点究竟是什么呢?1.占用内存少如果要注入的代码与数据较少,那么就不需要将它们做成DLL的形式再注入。此时直接采用 代码注入的方式同样能够获得与DLL注入相同的效果,且占用...

phpstudy的mysql数据库怎么用_phpstudy连接MySQL数据库的基本操作_凯然的博客-程序员秘密

MySQL客户端下,操作服务器的步骤1.连接到MySQL数据库服务器mysql -hlocalhost -uroot -proot(主机、用户、密码)2.选择要操作的数据库use db_name;3.设置当前环境的显示字符集set name gbk;//在MySQL客户端下只能使用gbk,别的编码都不可以。4.执行SQL语句对数据表进行查询增加:INSERT INTO table_name(字段1...

oracle导入数据库方式,Oracle数据库的导入和导出的两种方式_憨憨的祝小铁的博客-程序员秘密

首先,我们导入导出数据,肯定是要通过oracle自带的可运行程序来完成数据的导入导出工作,imp.exe 和exp.exe这两个可运行文件都放在oracle安装目录下的BIN目录下。1.以cmd命令操作符导入导出先以cmd命令操作符来演示,比如我的BIN目录是在:D:\app\Administrator\product\11.1.0\db_1\BIN 这里面。可以将该目录添加到系统的环境变量中,这...

TCP/IP 详解卷一学习笔记(二):网络层 IP_xgf415的博客-程序员秘密

IP: 网际协议IP 首部IP 路由选择子网寻址子网掩码

狂神说Linux学习笔记_隔壁郑同学的博客-程序员秘密

狂神说Linux1、入门概述我们为什么要学习Linuxlinux诞生了这么多年,以前还喊着如何能取代windows系统,现在这个口号已经小多了,任何事物发展都有其局限性都有其天花板。就如同在国内再搞一个社交软件取代腾讯一样,想想而已基本不可能,因为用户已经习惯于使用微信交流,不是说技术上实现不了解而是老百姓已经习惯了,想让他们不用,即使他们自己不用亲戚朋友还是要用,没有办法的事情。用习惯了windows操作系统,再让大家切换到别的操作系统基本上是不可能的事情,改变一个人已经养成的习惯太难。没有办

Leetcode 322:零钱兑换(最详细的解法!!!)_coordinate_blog的博客-程序员秘密

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。示例 1:输入: coins = [1, 2, 5], amount = 11输出: 3 解释: 11 = 5 + 5 + 1示例 2:输入: coins = [2], amount = 3输出: -1说明:你可以...

推荐文章

热门文章

相关标签