最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中Parser的用法

 更新時(shí)間:2023年05月25日 10:31:07   作者:web17886480312  
這篇文章主要介紹了Java?Parser使用指南,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前言

以下翻譯自官網(wǎng)的書(shū)

入門(mén)-Start

JavaParser Class

用途:把Java源碼轉(zhuǎn)換成 JavaParser定義的Statement對(duì)象

Eg:

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

CompilationUnit Class

用途:是一個(gè)完整的類文件的表示
在AST中,你可以把這個(gè)類看成是AST的根節(jié)點(diǎn)

Visitor Classes

用途:用于找到某個(gè)類型的節(jié)點(diǎn)

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方法能夠?qū)ILE_PATH所定義的類文件編譯成CompilationUnit(可以理解為AST樹(shù)的根節(jié)點(diǎn),存有被編譯的源代碼的一切信息),接下來(lái)我們就可以通過(guò)遍歷CompilationUnit來(lái)獲得我們想要得到的信息啦!

Comments

一個(gè)節(jié)點(diǎn)(node)只能有一個(gè)comment
可以在他的comment域中訪問(wèn)

comment的類型

  • LineComment
  • BlockComment
  • JavadocComment

Orphan Comment:
不能歸為AST樹(shù)中的某一個(gè)節(jié)點(diǎn)的Comment

Pretty Printing and Lexical Preservation

Pretty Printing: 打印出格式化的代碼
Lexical Preservation: 原來(lái)的代碼什么樣,現(xiàn)在的代碼就什么樣

Javaparser-Solving Symbols and References

JavaParser開(kāi)發(fā)者教程

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的時(shí)候,我們需要知道這個(gè)symbol來(lái)自哪里(i.e. 是類內(nèi)定義的,還是類外定義的…),因此JavaSymbolSolver有這樣幾種類型去確定類來(lái)自哪里,

簡(jiǎn)單來(lái)說(shuō)下面這些類就是 JavaSymbolSolver查找類的方式

TypeSolver的類型

類型

功能

JarTypeSolver

在.jar文件中尋找類,我們需要傳入一個(gè).jar文件的位置

JavaParserTypeSolve

在souce file中尋找文件,我們只需傳入根目錄即可

ReflectionTypeSolver

一些類作為語(yǔ)言的一部分被定義,比如 java.lang.Object

MemoryTypeSolver

簡(jiǎn)單地返回我們記錄的文件,多用于測(cè)試

CombinedTypeSolver

將幾個(gè)不同的solver合并成一個(gè)

其他:

類(com.github.javaparser.symbolsolver)

功能

JavaSymbolSolver

創(chuàng)建后插入CompilationUnit可以創(chuàng)建符號(hào)解析
使用方法: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"));
	}
}

作用是返回以下三個(gè)包里面的 symbol是作為field還是method

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

Ex3 Resolving a Type in a context

這個(gè)例子應(yīng)用如下的場(chǎng)景:
解析一個(gè)變量的類型是來(lái)自哪里

懶得截代碼了,大家自己找官網(wǎng)的pdf看吧

Ex4 Resolving method calls

可以知道一個(gè)method調(diào)用的對(duì)應(yīng)的函數(shù)簽名(signature)

Ex5 Using the Combined Type Solver

使用結(jié)合的type solver

Ex6 Using the MemoryTypeSolver JavaSymbolSolver

JavaSymbolSolver

  • combinedsolver

到此這篇關(guān)于Java Parser使用指南的文章就介紹到這了,更多相關(guān)Java Parser使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中final關(guān)鍵字和final的四種用法實(shí)例

    Java中final關(guān)鍵字和final的四種用法實(shí)例

    final關(guān)鍵字代表最終的、不可改變的,下面這篇文章主要給大家介紹了關(guān)于Java中final關(guān)鍵字和final的四種用法實(shí)例,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • SpringBoot注冊(cè)web組件的實(shí)現(xiàn)方式

    SpringBoot注冊(cè)web組件的實(shí)現(xiàn)方式

    Servlet是Java Web應(yīng)用程序的基礎(chǔ),它提供了處理客戶端請(qǐng)求的機(jī)制,Servlet三大組件是指Servlet、Filter和Listener,它們是Java Web應(yīng)用程序的核心組件,本文將給大家介紹一下SpringBoot注冊(cè)web組件的實(shí)現(xiàn)方式,需要的朋友可以參考下
    2023-10-10
  • java 8如何自定義收集器(collector)詳解

    java 8如何自定義收集器(collector)詳解

    這篇文章主要給大家介紹了關(guān)于java 8如何自定義收集器(collector)的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-06-06
  • apache ant進(jìn)行zip解壓縮操作示例分享

    apache ant進(jìn)行zip解壓縮操作示例分享

    本文主要介紹了使用apache ant進(jìn)行zip解壓縮操作的方法,可以解決中文編碼和首層父類無(wú)法創(chuàng)建問(wèn)題,需要的朋友可以參考下
    2014-02-02
  • Spring Security單項(xiàng)目權(quán)限設(shè)計(jì)過(guò)程解析

    Spring Security單項(xiàng)目權(quán)限設(shè)計(jì)過(guò)程解析

    這篇文章主要介紹了Spring Security單項(xiàng)目權(quán)限設(shè)計(jì)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • JAVA JVM面試題總結(jié)

    JAVA JVM面試題總結(jié)

    JVM 可以屏蔽與具體操作系統(tǒng)平臺(tái)相關(guān)的信息,使 Java 程序只需生成在 Java 虛擬機(jī)上運(yùn)行的目標(biāo)代碼,就可以在不同的平臺(tái)上運(yùn)行。這篇文章主要介紹了JAVA JVM面試題總結(jié),大家可以參考一下
    2021-08-08
  • java線程并發(fā)cyclicbarrier類使用示例

    java線程并發(fā)cyclicbarrier類使用示例

    CyclicBarrier類似于CountDownLatch也是個(gè)計(jì)數(shù)器,不同的是CyclicBarrier數(shù)的是調(diào)用了CyclicBarrier.await()進(jìn)入等待的線程數(shù),當(dāng)線程數(shù)達(dá)到了CyclicBarrier初始時(shí)規(guī)定的數(shù)目時(shí),所有進(jìn)入等待狀態(tài)的線程被喚醒并繼續(xù),下面使用示例學(xué)習(xí)他的使用方法
    2014-01-01
  • JAVA實(shí)現(xiàn)鏈表面試題

    JAVA實(shí)現(xiàn)鏈表面試題

    這篇文章主要為大家詳細(xì)介紹了JAVA相關(guān)實(shí)現(xiàn)鏈表的面試題,代碼實(shí)現(xiàn)非常詳細(xì),每一個(gè)方法講解也很到位,特別適合參加Java面試的朋友閱讀
    2015-09-09
  • Spring Boot結(jié)合ECharts案例演示示例

    Spring Boot結(jié)合ECharts案例演示示例

    本文主要主要介紹了Spring Boot結(jié)合ECharts案例演示示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • maven倉(cāng)庫(kù)中心mirrors配置多個(gè)下載中心(執(zhí)行最快的鏡像)

    maven倉(cāng)庫(kù)中心mirrors配置多個(gè)下載中心(執(zhí)行最快的鏡像)

    這篇文章主要介紹了maven倉(cāng)庫(kù)中心mirrors配置多個(gè)下載中心(執(zhí)行最快的鏡像),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評(píng)論

伊宁县| 富锦市| 彭泽县| 玛曲县| 红河县| 通海县| 景洪市| 南安市| 杭锦后旗| 龙口市| 余姚市| 濉溪县| 武乡县| 成安县| 怀远县| 嘉峪关市| 石渠县| 南靖县| 扶风县| 大理市| 凤山县| 贞丰县| 嘉兴市| 武清区| 五原县| 安平县| 运城市| 和顺县| 海安县| 墨脱县| 招远市| 钦州市| 芒康县| 承德市| 贵溪市| 青川县| 平武县| 蓬溪县| 宜阳县| 台安县| 临猗县|