Java中Parser的用法

 更新时间:2023年05月25日 10:31:07   作者:web17886480312  
这篇文章主要介绍了Java Parser使用指南,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

前言

以下翻译自官网的书

入门-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

到此这篇关于Java Parser使用指南的文章就介绍到这了,更多相关Java Parser使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis saveBatch 性能调优的实现

    MyBatis saveBatch 性能调优的实现

    本文主要介绍了MyBatis saveBatch 性能调优的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • java如何实现基于opencv全景图合成实例代码

    java如何实现基于opencv全景图合成实例代码

    全景图相信大家应该都不陌生,下面这篇文章主要给大家介绍了关于java如何实现基于opencv全景图合成的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-07-07
  • Object类wait及notify方法原理实例解析

    Object类wait及notify方法原理实例解析

    这篇文章主要介绍了Object类wait及notify方法原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • java DateUtil工具类时间戳类型转换详解

    java DateUtil工具类时间戳类型转换详解

    这篇文章主要为大家详细介绍了java DateUtil工具类时间戳类型转换的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Java进阶之高并发核心Selector详解

    Java进阶之高并发核心Selector详解

    前几篇文章介绍了Java高并发的一些基础内容,认识了Channel,Buffer和Selector的基本用法,有了感性认识之后,来看看Selector的底层是如何实现的。,需要的朋友可以参考下
    2021-05-05
  • Mybatis-Plus自动生成代码的实现示例

    Mybatis-Plus自动生成代码的实现示例

    在工作中,程序员很多时候都是在写类似的代码,可以使用自动生成代码,本文主要介绍了Mybatis-Plus自动生成代码的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • java随机生成一个名字和对应拼音的方法

    java随机生成一个名字和对应拼音的方法

    这篇文章主要介绍了java随机生成一个名字和对应拼音的方法,涉及java针对数组及随机数操作的相关技巧,需要的朋友可以参考下
    2015-07-07
  • Mybatis Example的高级用法详解

    Mybatis Example的高级用法详解

    这篇文章主要介绍了Mybatis Example的高级用法详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Spring JDBC的使用详解

    Spring JDBC的使用详解

    这篇文章主要介绍了Spring JDBC的使用详解,帮助大家更好的理解和学习使用SpringBoot框架,感兴趣的朋友可以了解下
    2021-05-05
  • Java Socket编程(四) 重复和并发服务器

    Java Socket编程(四) 重复和并发服务器

    Java Socket编程(四) 重复和并发服务器...
    2006-12-12

最新评论