JavaParser使用指南_java parser-程序员宅基地

技术标签: java  后端  

JavaParser使用指南

前言

以下翻译自官网的书

入门-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
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shuux666/article/details/123751279

智能推荐

matlab iir 高通滤波器的设计,基于MATLAB的IIR滤波器的设计.doc-程序员宅基地

文章浏览阅读598次。MACROBUTTON MTEditEquationSection2 SEQ MTEqn \r \h \* MERGEFORMAT SEQ MTSec \r 1 \h \* MERGEFORMAT SEQ MTChap \r 1 \h \* MERGEFORMAT 毕业设计 课程设计 毕业论文 详细资料 联系QQ号;1620812008本科毕业设计(论文)基于MATLAB的IIR滤波..._matlab设计iir滤波器为高通滤波器,截至频率为0.5π

pycharm代码上传到github_git commit为什么需要邮箱和名字、-程序员宅基地

文章浏览阅读6.5k次,点赞11次,收藏26次。一.准备工作Ⅰ.git下载和安装要连接GitHub,首先git是必不可少的,git的安装的基本使用很简单,这里并不是讲git使用的教程,所以只是提一下就略过了.Ⅱ.GitHub设置添加SSH Key这一步算是连接GitHub的最基本的一步了,git是分布式的代码管理工具,远程的代码管理是基于ssh的,所以得先配好SSH key.1.创建一个SSH Key打开终端,windows下面可能叫做git ..._git commit为什么需要邮箱和名字、

B+Tree 在线模拟_在线体验b+tree-程序员宅基地

文章浏览阅读2.4k次,点赞8次,收藏9次。链接地址:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html数据结构可视化:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html_在线体验b+tree

缺失值的查找与替换_ggto05.net-程序员宅基地

文章浏览阅读5.6k次。X<-c(1,2,3,NA,5) y<-c(236,90,56,NA,7) z<-c(54,6558,5,21,5) x1<-data.frame(X,y,z) r<-c(NA,1,2,NA,NA)ee> ee X y z r1 1 236 54 NA2 2 90 6558 13 3 56 5 24 NA NA 21 NA5 5_ggto05.net

R判别分析_判别分析的应用案例r语言-程序员宅基地

文章浏览阅读377次。常用的判别分析方法是距离判别、贝叶斯判别和Fisher判别等。_判别分析的应用案例r语言

Maven基础(三)—— 依赖管理与生命周期_项目依赖管理生命周期-程序员宅基地

文章浏览阅读124次。1、依赖管理1、依赖配置依赖指当前项目运行所需的jar,一个项目可以设置多个依赖2、依赖传递将project03的坐标复制到project02的依赖中直接依赖:在当前项目中通过依赖配置建立的依赖关系间接依赖∶被资源的资源如果依赖其他资源,当前项目间接依赖其他资源路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的特殊优先:当同级配置了相同资源的不同_项目依赖管理生命周期

随便推点

current_thread_info在ARM32和ARM64平台的不同点解析_arm64 thread_info-程序员宅基地

文章浏览阅读2.5k次。首先对current_thread_info不熟悉的同学可以先百度一下这是个什么东西?我们这里仅仅简单的提一下,current_thread_info用于获取当前进程的信息。ARM32平台相关定义#define THREAD_SIZE_ORDER 1#define THREAD_SIZE (PAGE_SIZE &lt;&lt; THREAD_SIZE_ORDER)union thr..._arm64 thread_info

阿里P8用这份402页多线程与架构设计笔记,征服你 吊打你_阿里线程框架-程序员宅基地

文章浏览阅读121次。前言随着计算机硬件的不断发展,CPU进入多核时代,并发运算因此也上升到了并行运算的高度,作为Java程序员,如何最大化地“压榨”CPU的资源,利用CPU超高的计算速度编写高效快速运行的程序,如何解决CPU与RAM之间速度不匹配的问题呢?今天分享一份《Java高并发编程详解多线程与架构设计》就会帮你解决这些问题,本书结合作者的实践经验,不仅介绍了高速缓存Cache、Cache Line、Java内存模型,以及现代CPU基本架构等相关知识,还深入讲解了Java跨平台的高并发解决方案。本书实._阿里线程框架

宝塔php伪静态规则,使用宝塔管理nginx伪静态规则配置方法技巧-程序员宅基地

文章浏览阅读1.8k次。我们网站使用的服务器环境一般有IIS、Apache、Tomcat、Nginx 等,他们各有优劣。一般虚拟空间使用IIS 和 Apache居多,这两个的配置都比较简单,IIS一般都安装了ISAPI_Rewrite 模块,可以直接使用和Apache一样的.htaccess文件来配置,直接将.htaccess文件上传到网站根目录即可。.htaccess 文件代码RewriteEngine OnRewri..._宝塔怎么添加htaccess规则

2023 Zblog对接微信小程序源码 附教程_博客小程序源码-程序员宅基地

文章浏览阅读189次。在HbuilderX中打开前端项目,依次点击 运行 =》 运行到小程序模拟器 =》微信开发者工具。必要工具:HbuilderX,微信开发者工具。_博客小程序源码

mysql组合索引与单列索引_假设有一张名为orders的订单表-程序员宅基地

文章浏览阅读1.1k次。1、组合索引能够避免回表查询:假设有一张订单表(orders),包含order_id和product_id二个字段。一共有31条数据。符合下面语句的数据有5条。执行下面的sql语句:select product_id from orderswhere order_id in (123, 312, 223, 132, 224);这条语句要mysql去根据order_id进行搜索,然后返回_假设有一张名为orders的订单表

python+jenkins持续集成输出html测试报告_jenkins + python + publish html reports-程序员宅基地

文章浏览阅读7k次。前言在jenkins上展示html的报告,需要添加一个HTML Publisher plugin插件,把生成的html报告放到指定文件夹,这样就能用jenkins去读出指定文件夹的报告了。一、构建后操作1.前面执行完测试用例后,可以用“添加构建后操作步骤”,读出html报告文件2.如果你的展开后有Publish THML reports这_jenkins + python + publish html reports

推荐文章

热门文章

相关标签