Giter Site home page Giter Site logo

javaee_javaparser's Introduction

Javaee_javaparser

F0 a

1. 运行方法

使用idea配置好项目后,运行MethodCallAnalyzer.java即可。

2. 类设计介绍

2.1 Analyzable接口设计分析

2.1.1 接口的职责

Analyzable 是一个泛型接口,表示一个可分析的实体。它定义了一个实体应该如何进行分析,但没有提供具体的实现。这样的设计可以使得任何实现此接口的类都必须提供对应的分析逻辑。

2.1.2 泛型参数
  • T: 表示返回的分析结果的类型。这使得该接口具有高度的通用性,可以用于分析并返回各种类型的结果。
2.1.3 方法
  • List<T> analyze(): 该方法定义了如何进行分析,并返回一个包含分析结果的列表。返回的列表类型为泛型参数T,这意味着具体的实现类可以返回任意类型的分析结果。
2.1.4 使用场景

接口的设计是为了提供一个统一的方法来定义如何进行分析。任何类只要实现了这个接口,就表示它是可分析的,并且需要提供具体的分析方法。在之前提供的代码中,ClassInfo 类就实现了这个接口,表示它可以分析并返回方法的信息。

总体来说,Analyzable接口为实现它的类提供了一个标准化的方式来进行分析,并返回分析结果。这种设计提供了良好的扩展性和灵活性,允许添加更多的可分析的实体,而不需要对现有的代码进行大量的修改。

2.2 MethodCallAnalyzer类设计分析

2.2.1 类的职责

MethodCallAnalyzer 类主要负责获取用户输入的方法信息,并调用相应的分析器进行分析。它接收用户提供的方法名、类名和深度等信息,并利用这些信息进行方法调用的分析。

2.2.2 属性
  • methodName: 一个字符串,存储方法的名称。
  • packageName: 一个字符串,存储方法所在的包名。
  • className: 一个字符串,存储方法所在的类名。
  • depth: 一个整数,表示分析的深度。
2.2.3 主方法
  • public static void main(String[] args): 是程序的入口方法,创建Scanner对象获取用户的输入,并调用analyzeMethodCall方法进行分析。
2.2.4 方法
  • public void analyzeMethodCall(String userInput): 主要负责处理用户的输入。它分割输入的字符串,从中提取方法名、类名、包名和深度等信息,然后使用ProjectAnalyzer进行方法调用的分析。
2.2.5 用户输入处理

在程序的主方法中,首先使用Scanner对象来获取用户的输入。然后去除用户输入中的所有空白字符,并传递给analyzeMethodCall方法。

analyzeMethodCall方法中,首先将用户的输入分割成不同的部分。对于合适的输入格式,该方法将提取方法名、完整的类名和深度信息。它进一步将完整的类名分割成包名和类名。最后,它验证深度信息的格式,并提取深度值。

如果用户的输入格式不正确,程序将给出相应的错误提示。

2.2.6 方法调用分析

在提取了所有必要的信息之后,MethodCallAnalyzer 创建一个ProjectAnalyzer对象并调用其analyzeSpecificMethod方法,进行具体的方法调用分析。

总的来说,MethodCallAnalyzer类提供了一个简单的用户界面,允许用户输入方法调用的相关信息,并调用相应的分析器进行分析。

2.3 ProjectAnalyzer类设计分析

2.3.1 类的职责

ProjectAnalyzer 类主要负责分析Java项目中的类和方法。它可以扫描指定包内的所有Java文件,对其进行解析,并提取出类和方法的相关信息。

2.3.2 属性
  • javaFiles: 一个列表,存储项目中的所有Java文件。
  • packageName: 一个字符串,代表项目的包名。
  • CONFIGURED_PARSER: 是一个静态的 JavaParser 实例,已经被配置,用于解析Java文件。
2.3.3 构造函数
  • ProjectAnalyzer(String packageName): 构造函数接收一个包名作为参数。在构造函数中,它初始化了Java文件列表和JavaParser的配置。
2.3.4 方法
  • getJavaFiles(File directory): 这是一个静态方法,递归地从指定目录中获取所有Java文件。
  • analyze(): 分析项目中的类,并返回一个类信息列表。这个方法主要遍历Java文件列表,解析每个Java文件并提取其中的类声明。
  • analyzeSpecificMethod(String methodName, String className, int depth): 分析指定类中的特定方法,并显示它调用的方法和被哪些方法调用。它首先调用 analyze() 方法来获取类信息列表,然后对这些类信息中的方法进行进一步分析。
2.3.5 JavaParser和符号解析

类中使用了 JavaParserJavaSymbolSolver 来解析Java代码。这两者都是JavaParser库的组成部分。其中:

  • JavaParser: 用于解析Java源代码。
  • JavaSymbolSolver: 用于解决Java代码中的符号。

为了支持符号解析,类中配置了 CombinedTypeSolver,它结合了 ReflectionTypeSolverJavaParserTypeSolver。其中:

  • ReflectionTypeSolver: 使用Java的反射API来解决类型。
  • JavaParserTypeSolver: 使用JavaParser来解决类型。

2.4 ClassInfo类设计分析

2.4.1 类的职责

ClassInfo 类主要负责存储和分析关于Java类的信息,如类的名称、包名、以及类中定义的所有方法。

2.4.2 属性
  • unit: 类型为CompilationUnit,存储了类的所有源代码信息。
  • methods: 是一个列表,存储类中的所有MethodInfo对象。
2.4.3 构造函数
  • ClassInfo(CompilationUnit unit): 构造函数接收一个CompilationUnit对象作为参数。它初始化了类的源代码信息和methods列表。
2.4.4 方法
  • analyze(): 分析CompilationUnit中定义的所有类和接口,提取出其中的所有方法,并为每个方法创建一个MethodInfo对象,然后添加到methods列表中。
  • getClassName(): 获取CompilationUnit中的第一个类或接口声明的名称。
  • getPackageName(): 获取CompilationUnit中的包声明。如果包声明存在,则返回包名,否则返回一个空字符串。
  • getMethods(): 返回类中的所有MethodInfo对象。
2.4.5 JavaParser与类信息解析

在类中,使用了JavaParserCompilationUnit对象来获取类的所有源代码信息。此外,通过调用JavaParser提供的方法,如findAllgetMethodsgetClassByNamegetPackageDeclaration等,来提取和解析类的相关信息。

2.4.6 代码结构

analyze方法中,首先找到CompilationUnit中所有的类和接口声明,然后对每个类或接口声明,提取出其中定义的所有方法。为每个方法创建一个MethodInfo对象,并添加到methods列表中。这样,ClassInfo类可以为外部提供有关类的所有方法的详细信息。

总的来说,ClassInfo类为外部提供了一个方便的方式,来获取和分析Java类的基本信息和方法信息。

2.5 MethodInfo类设计分析

2.5.1 类的职责

MethodInfo 类主要负责存储与分析关于Java方法的信息,如方法的声明、被当前方法调用的其他方法、以及调用当前方法的其他方法等。

2.5.2 属性
  • declaration: 类型为MethodDeclaration,存储Java方法的声明。
  • calledMethods: 是一个列表,存储被当前方法调用的方法信息。
  • methodsCallingThis: 是一个列表,存储调用当前方法的方法信息。
2.5.3 构造函数
  • MethodInfo(MethodDeclaration declaration): 接收一个方法声明作为参数,并对calledMethodsmethodsCallingThis进行初始化。
2.5.4 方法
  • addCalledMethod(MethodInfo method): 添加一个被当前方法调用的方法到calledMethods列表中。
  • addMethodCallingThis(MethodInfo method): 添加一个调用当前方法的方法到methodsCallingThis列表中。
  • getMethodName(): 获取当前方法的名称。
  • getClassName(): 获取当前方法所在的类名。
  • analyze(List<MethodInfo> allMethods): 分析当前方法,找出它调用了哪些方法,并更新calledMethodsmethodsCallingThis列表。
  • getInvokes(int depth, int currentDepth, String packageName): 获取此方法调用的所有方法,并以特定格式输出。
  • getInvokedBy(int depth, int currentDepth, String packageName): 获取调用此方法的所有方法,并以特定格式输出。
2.5.5 方法调用和解析

类中使用了JavaParser的方法来解析方法的调用和被调用信息。它搜索所有的方法调用表达式,并尝试解析它们,然后对比它们与所有已知的方法,以确定调用关系。此外,类还提供了方法来生成关于方法调用关系的输出,以供外部使用。

2.5.6 异常处理

analyze方法中,当遇到无法解析的方法调用时,类会捕获异常并打印出相关信息,确保程序不会因为单个方法的问题而崩溃。

javaee_javaparser's People

Contributors

bxzzcj avatar date-w avatar cu-oh-2 avatar

Stargazers

 avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.