JavaParser使用指南

2023-05-16

抱歉这个博客是很久以前写的,现在我已经不用javaparser了,这个包也一直在更新所以这篇博客参考意义不大。

大家可以根据官网的例子去试试。

JavaParser使用指南

  • 前言
  • 入门-Start
    • JavaParser Class
    • CompilationUnit Class
    • Visitor Classes
    • A Simple Visitor
  • Comments
  • Pretty Printing and Lexical Preservation
  • Javaparser-Solving Symbols and References
    • Ex1: 获取变量(引用)的类型
    • Ex2: 使用absolute name直接解析类型
    • Ex3 Resolving a Type in a context
    • Ex4 Resolving method calls
    • Ex5 Using the Combined Type Solver
    • Ex6 Using the MemoryTypeSolver
  • JavaSymbolSolver

前言

以下翻译自官网的书

入门-Start

JavaParser Class

用途:把Java源码转换成 JavaParser定义的Statement对象

Eg:

Statement expression = JavaParser.parseStatement("int a=0;");

CompilationUnit Class

用途:是一个完整的类文件的表示
在AST中,你可以把这个类看成是AST的根节点

Visitor Classes

用途:用于找到某个类型的节点

A Simple Visitor

package com.github.javaparser;

import com.github.javaparser.*;
import com.github.javaparser.ast.*;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.EnumDeclaration;
import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.symbolsolver.JavaSymbolSolver;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
import com.github.javaparser.utils.SourceRoot;

import java.io.File;

public class VoidVisitorStarter {
	private static final String FILE_PATH = "ReversePolishNotation.java";
			
	public static void main(String[] args) throws Exception {
			
			CompilationUnit cu = JavaParser.parse(new File(FILE_PATH));
			
	}
}

上面的parse方法能够将FILE_PATH所定义的类文件编译成CompilationUnit(可以理解为AST树的根节点,存有被编译的源代码的一切信息),接下来我们就可以通过遍历CompilationUnit来获得我们想要得到的信息啦!

Comments

一个节点(node)只能有一个comment
可以在他的comment域中访问

comment的类型

  • LineComment
  • BlockComment
  • JavadocComment

Orphan Comment:
不能归为AST树中的某一个节点的Comment

Pretty Printing and Lexical Preservation

Pretty Printing: 打印出格式化的代码
Lexical Preservation: 原来的代码什么样,现在的代码就什么样

Javaparser-Solving Symbols and References

JavaParser开发者教程

Symbol的定义
Java code中的所有name都可以称作为symbol

TypeSolver的作用
确定寻找类的位置

原文:What the hell is a Type Solver? It is the object which knows where to look for classes. When processing source code you will typically have references to code that is not yet compiled, but it is just present in other source files. You could also use classes contained in JARs or classes from the Java standard libraries. You have just to tell to your TypeSolver where to look for classes and it will figure it out.

由于在解析symbol的时候,我们需要知道这个symbol来自哪里(i.e. 是类内定义的,还是类外定义的…),因此JavaSymbolSolver有这样几种类型去确定类来自哪里,

简单来说下面这些类就是 JavaSymbolSolver查找类的方式

TypeSolver的类型

类型功能
JarTypeSolver在.jar文件中寻找类,我们需要传入一个.jar文件的位置
JavaParserTypeSolve在souce file中寻找文件,我们只需传入根目录即可
ReflectionTypeSolver一些类作为语言的一部分被定义,比如 java.lang.Object
MemoryTypeSolver简单地返回我们记录的文件,多用于测试
CombinedTypeSolver将几个不同的solver合并成一个

其他:

类(com.github.javaparser.symbolsolver)功能
JavaSymbolSolver创建后插入CompilationUnit可以创建符号解析
使用方法:ParserConfiguration.setSymbolResolver(SymbolResolver)

Ex1: 获取变量(引用)的类型

public class GetTypeOfReference {

private static final String FILE_PATH = "src/main/java/org/javaparser/exampl\
4 es/chapter5/Bar.java";

public static void main(String[] args) throws FileNotFoundException {
	TypeSolver typeSolver = new CombinedTypeSolver();

	JavaSymbolSolver symbolSolver = new JavaSymbolSolver(typeSolver);
	JavaParser.getStaticConfiguration().setSymbolResolver(symbolSolver);

	CompilationUnit cu = JavaParser.parse(new File(FILE_PATH));

	cu.findAll(AssignExpr.class).forEach(ae -> {
		ResolvedType resolvedType = ae.calculateResolvedType();
		System.out.println(ae.toString() + " is a: " + resolvedType);
	});
}
}

Ex2: 使用absolute name直接解析类型

package com.github.awesomelemon;

import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;

public class UsingTypeSolver {
	private static void showReferenceTypeDeclaration(
			ResolvedReferenceTypeDeclaration resolvedReferenceTypeDeclaration) {

		System.out.println(String.format("== %s ==", resolvedReferenceTypeDeclaration.getQualifiedName()));
		System.out.println(" fields:");
		resolvedReferenceTypeDeclaration.getAllFields()
				.forEach(f -> System.out.println(String.format(" %s %s", f.getType(), f.getName())));
		System.out.println(" methods:");
		resolvedReferenceTypeDeclaration.getAllMethods()
				.forEach(m -> System.out.println(String.format(" %s", m.getQualifiedSignature())));
		System.out.println();
	}

	public static void main(String[] args) {
		TypeSolver typeSolver = new ReflectionTypeSolver();

		showReferenceTypeDeclaration(typeSolver.solveType("java.lang.Object"));
		showReferenceTypeDeclaration(typeSolver.solveType("java.lang.String"));
		showReferenceTypeDeclaration(typeSolver.solveType("java.util.List"));
	}
}

作用是返回以下三个包里面的 symbol是作为field还是method

  • java.lang.Object
  • java.lang.String
  • java.util.List

Ex3 Resolving a Type in a context

这个例子应用如下的场景:
解析一个变量的类型是来自哪里

懒得截代码了,大家自己找官网的pdf看吧

Ex4 Resolving method calls

可以知道一个method调用的对应的函数签名(signature)

Ex5 Using the Combined Type Solver

使用结合的type solver

Ex6 Using the MemoryTypeSolver

JavaSymbolSolver

JavaSymbolSolver

  • combinedsolver
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaParser使用指南 的相关文章

  • LINGO使用指南(转载)

    LINGO是用来求解线性和非线性优化问题的简易工具 LINGO内置了一种建立最优化模型的语言 xff0c 可以简便地表达大规模问题 xff0c 利用LINGO高效的求解器可快速求解并分析结果 1 LINGO快速入门 当你在windows下开
  • fio使用指南

    这个文档是对fio 2 0 9 HOWTO文档的翻译 xff0c fio的参数太多了 xff0c 翻译这个文档时并没有测试每一个参数的功能和使用方法 xff0c 只有少量参数做了试验 xff0c 大部分的参数采用的是根据字面翻译或是个人理解
  • 【Linux】Ubuntu 使用指南

    content 1 换清华源2 更新三步走3 1 换清华源 备份 Ubuntu 的软件源配置文件 etc apt sources list span class token function sudo span span class tok
  • mysql使用指南

    目录 一 SQL简述1 SQL的概述2 SQL的优点3 SQL的分类 二 数据库的三大范式三 数据库的数据类型1 整数类型2 浮点数类型和定点数类型3 字符串类型4 字符串类型5 日期与时间类型 四 数据库 数据表的基本操作1 数据库的基本
  • 七牛云存储 CDN 使用指南

    七牛cdn 使用指南 更新于2016 3 13 分为两种情况 xff1a 1 使用七牛存储 2 直接使用七牛cdn 一 使用七牛存储 xff08 七牛的存储默认使用cdn加速 xff09 静态资源存储到七牛后 xff0c 可以使用七牛提供的
  • 使用Formik轻松开发更高质量的React表单(二)使用指南

    一个基本的例子 设想你要开发一个可以编辑用户数据的表单 不过 xff0c 你的用户API端使用了具有类似下面的嵌套对象表达 xff1a id string email string social facebook string twitte
  • Github使用指南

    文章目录 注册成为用户GitHub功能及常用词汇板块说明Your profile使用仓库上传资源查找资源 注册成为用户 首次使用GitHub并准备长期使用需要先注册 xff0c 当然也可以以游客的方式进行浏览 登录官网GitHub Wher
  • fio使用指南

    这个文档是对fio 2 0 9 HOWTO文档的翻译 xff0c fio的参数太多了 xff0c 翻译这个文档时并没有测试每一个参数的功能和使用方法 xff0c 只有少量参数做了试验 xff0c 大部分的参数采用的是根据字面翻译或是个人理解
  • Idea使用指南

    安装 只选一个X64 xff0c 其余一路next 使用 xff1a
  • 通用环形缓冲区 LwRB 使用指南

    什么是 LwRB xff1f LwRB 是一个开源 通用环形缓冲区库 xff0c 为嵌入式系统进行了优化 源码点击这里 Github LwRB 特性 使用 ANSI C99 编写FIFO xff08 先进先出 xff09 无动态内存分配 x
  • 【MATLAB UAV Toolbox】使用指南(一)

    开始使用UAV Toolbox 设计 xff0c 仿真和部署无人机应用程序 UAV Toolbox给设计 仿真 测试和部署无人机应用程序提供了工具和参考应用 你能够设计自动飞行算法 无人机任务和飞行控制器 飞行日志分析仪应用程序可以让您交互
  • STC-ISP使用指南

    该软件无需安装 xff0c 下载后打开直接用 本软件是专门给STC系列单片机下载烧录程序的 xff0c 并不能适用于ARM系列的单片机 界面介绍 xff1a 打开后的界面如下 xff1a 左边的部分一般是用来下载程序的 xff0c 右面一般
  • xsemaphoretake返回_FreeRTOS 使用指南

    http xilinx eetrend com article 7845 2014 繁星电子开发团队制作 作为一个轻量级的操作系统 xff0c FreeRTOS 提供的功能包括 xff1a 任务管理 时间管理 信号量 消息队列 内存管理 记
  • java源码解析JavaParser

    package com bootdo jparser import java io File import java io FileNotFoundException import com github javaparser JavaPar
  • JavaParser使用指南

    抱歉这个博客是很久以前写的 xff0c 现在我已经不用javaparser了 xff0c 这个包也一直在更新所以这篇博客参考意义不大 大家可以根据官网的例子去试试 JavaParser使用指南 前言入门 StartJavaParser Cl
  • Javaparser使用

    Javaparser使用 什么是Javaparser 分析 转换 生成Java代码 Javaparser库为你提供了一个 Java 代码的抽象语法树 Abstract Syntax Tree AST 结构允许您以一种简单的编程方式使用 Ja
  • iperf3 使用指南

    iperf3的参数 xff1a s表示做服务器 c表示做客户端 t 表示表示发送时间 i 表示间隔多久报告一次 u 表示UDP xff0c 不加表示tcp R 表示服务器发客户端收 xff0c 不加默认客户端发 xff0c 服务器收 f 表
  • 【MATLAB UAV Toolbox】使用指南(三)

    可视化自定义飞行日志 通过配置flightLogSignalMapping可从自定义的飞行日志中可视化数据 加载自定义的飞行日志 在本例中 xff0c 假设飞行数据已经被解析到MATLAB 中 xff0c 并存储为M文件 本示例重点介绍如何
  • 如何使用 javaparser 获取类级别变量声明?

    我只想获取类级别的变量声明 如何使用 javaparser 获取声明 public class Login private Keyword browser private String pageTitle Login 使用javaparse
  • 使用 Java 解析器解析 Java 文件的属性

    我有以下3节课 public class A B b public class B C c public C getC A a return c public class C 我想使用具有以下信息的 java 解析器来解析类 类名 方法名称

随机推荐

  • Vscode代码初始设置

    Vscode代码初始设置 在 文件 gt 首选项 gt 设置 中可以直接复制即可 34 sync gist 34 34 6fb97970d1a4b846a37ce6ec2c95737c 34 34 git enableSmartCommit
  • C语言位域解析及在嵌入式编程中的应用

    位域的概念 位域 xff08 或者也能称之为位段 xff0c 英文表达是 Bit field xff09 是一种数据结构 xff0c 可以把数据以位元的形式紧凑的存储 xff0c 并允许程序员对此结构的位元进行操作 这种数据结构的好处是 x
  • STM32串口通信(串口中断、FIFO机制)之安富莱代码学习笔记

    创建串口设备结构体 span class token keyword typedef span span class token keyword struct span span class token punctuation span U
  • c语言函数未定义的引用,c – CMake“未定义的函数引用”

    我试图使用CMake链接库 BNO055 Driver 由于BNO055驱动程序不使用CMake并且大约一年没有更改 我决定只下载源文件并将它们放入我的项目中 然后我使用CMake创建一个库并链接它 问题是该链接似乎不起作用 当我编译项目时
  • RFID智能门禁系统设计

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • 基于单片机的节能照明仿真设计(#0049)

    功能描述 1 采用51 52单片机作为主控芯片 xff1b 2 采用光敏电阻 43 ADC0832检测光强 xff1b 3 具有声音检测和红外人体检测功能 xff1b 4 通过按键进行自动 手动模式切换 xff1b 5 手动模式 xff0c
  • 基于单片机的导盲仪系统设计(#0477)

    功能描述 1 采用51 52单片机 通用 作为主控制器 xff1b 2 采用HC SR04超声波模块测距 xff0c 测量范围0 02m 5 5m以上 xff1b 3 采用四位数码管切换显示 xff1a 障碍物距离 设置报警距离 xff0c
  • 基于单片机的可燃气烟雾系统设计(#0488)

    功能描述 本系统可用于可燃气体监测 烟雾火灾监测 1 采用51 52单片机 通用 作为主控芯片 xff1b 2 采用1602显示 xff1a 气体浓度的实时值及报警值 xff1b 3 采用MQ2 43 ADC0809检测气体浓度 xff1b
  • 析构函数的执行顺序

    析构函数的执行顺序 回答包括类定义的先后顺序 xff0c 局部和全部 xff0c 以及静态 xff0c 同时说明继承的关系 对于继承类的析构函数执行顺序为 xff0c 先派生类 xff0c 后基类 对于一个执行单元 xff08 cpp文件
  • 基于单片机的可燃气烟雾系统设计(#0489)

    功能描述 1 采用51 52单片机 通用 作为主控芯片 xff1b 2 采用数码管显示 xff1a 气体浓度等级 温度值 xff1b 3 采用MQ2 43 ADC0832检测气体浓度 xff1b 4 采用DS18B20检测温度 xff1b
  • 基于单片机的氢气监测系统设计(#0490)

    功能描述 1 采用51 52单片机 通用 作为主控芯片 xff1b 2 采用1602显示 xff1a 氢气浓度的实时值及报警值 xff1b 3 采用MQ8 43 ADC0809检测氢气浓度 xff1b 4 氢气浓度超标时 xff0c 蜂鸣报
  • 基于单片机的心率监测系统设计(#0495)

    功能描述 1 采用51 52单片机 通用 作为主控芯片 xff1b 2 采用1602液晶显示 xff1a 当前心率 报警上限 报警下限 xff1b 3 采用ST188红外对管检测心率 xff0c 当单片机检测到大约第5次信号时 xff0c
  • Verilog - 利用加法器实现乘法器 [代码]

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • LCD1602液晶 - 开发技术详解

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • LCD1602温度显示程序设计流程

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • 语音处理WT588D-20SS芯片 - 原理详解

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • 基于单片机的智能温度监测系统设计(电路图+程序)

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • 基于单片机的电子秤系统设计(电路+流程)

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • MPU6050 - 陀螺仪 - 技术总结

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • JavaParser使用指南

    抱歉这个博客是很久以前写的 xff0c 现在我已经不用javaparser了 xff0c 这个包也一直在更新所以这篇博客参考意义不大 大家可以根据官网的例子去试试 JavaParser使用指南 前言入门 StartJavaParser Cl