为什么需要一个这样的工具?

有时候我想要一个辅助我对现有java工程代码进行全面改造的工具,而这种改造工作比较精细特别,需要我做一些定制操作,而且现有的IDE内置工具没有提供这种特定化的改造功能。这时我就想,为了做这种改造,可以使用什么思路呢?

1.使用正则表达式查找并替换

对于某些重构操作确实有用,但是对于某些复杂的代码结构却无法精准且一次性就替换完成,精细度比较有限

2.编译源码,利用反射API解析代码功能,从而收集到代码结构相关的信息

优点:操作方便,信息精准

缺点:a.需要依赖jdk编译环境,编译有一定耗时

b.若代码文件依赖jar缺失,编译无法继续,阻断代码分析

c.编译后丧失了源码文件的注释和变量名称等源码特有信息,也无法帮助确定调用所在行数

3.直接对源代码进行解析,形成大致的结构描述信息,能够帮助获取到依赖声明,类定义以及类成员定义信息,相关代码块所在起止位置,如果能够通过操作结构化的解析对象信息改变源码内容,就更有利于辅助代码重构了。

本来是想独立实现的,但想到这样的工作一定有人做过,于是进入https://mvnrepository.com/去搜索一下,尝试输入java code parser,居然让我找到了这样一个工具javaParser。

下面就让我尝试使用javaParser

1.新建java maven工程,引入依赖

<dependency><groupId>com.github.javaparser</groupId><artifactId>javaparser-core</artifactId><version>3.14.5</version>
</dependency>

2.写一些单元测试,测试一下相关API,熟悉一下相关API功能,具体参照官网示例https://javaparser.org

解析:

CompilationUnit compilationUnit = StaticJavaParser.parse("class A { }");
Optional<ClassOrInterfaceDeclaration> classA = compilationUnit.getClassByName("A");

分析:

compilationUnit.findAll(FieldDeclaration.class).stream().filter(f -> f.isPublic() && !f.isStatic()).forEach(f -> System.out.println("Check field at line " +f.getRange().map(r -> r.begin.line).orElse(-1)));

转换:

compilationUnit.findAll(ClassOrInterfaceDeclaration.class).stream().filter(c -> !c.isInterface()&& c.isAbstract()&& !c.getNameAsString().startsWith("Abstract")).forEach(c -> {String oldName = c.getNameAsString();String newName = "Abstract" + oldName;System.out.println("Renaming class " + oldName + " into " + newName);c.setName(newName);});

生成:

CompilationUnit compilationUnit = new CompilationUnit();
ClassOrInterfaceDeclaration myClass = compilationUnit.addClass("MyClass").setPublic(true);
myClass.addField(int.class, "A_CONSTANT", PUBLIC, STATIC);
myClass.addField(String.class, "name", PRIVATE);
String code = myClass.toString();

PS:

甚至于我可以借助该工具实现某些不同编程语言代码向与ava代码相互转换的辅助工具,比如Python与Java的代码互转,虽说比较困难,但是实现一些比较简单通用的API互转当前还是可以做到的。这块现在我在gitee码云上在尝试去做,希望有朝一日能够实现比较可用的版本。

使用javaparser分析重构java源码相关推荐

  1. java hashset 实现_HashSet实现原理分析(Java源码剖析)

    本文将深入讨论HashSet实现原理的源码细节.在分析源码之前,首先我们需要对HashSet有一个基本的理解. HashSet只存储不同的值,set中是不会出现重复值的. HashSet和HashMa ...

  2. Java源码详解六:ConcurrentHashMap源码分析--openjdk java 11源码

    文章目录 注释 类的继承与实现 数据的存储 构造函数 哈希 put get 扩容 本系列是Java详解,专栏地址:Java源码分析 ConcurrentHashMap 官方文档:ConcurrentH ...

  3. Java源码详解四:String源码分析--openjdk java 11源码

    文章目录 注释 类的继承 数据的存储 构造函数 charAt函数 equals函数 hashCode函数 indexOf函数 intern函数 本系列是Java详解,专栏地址:Java源码分析 Str ...

  4. Java源码详解五:ArrayList源码分析--openjdk java 11源码

    文章目录 注释 类的继承与实现 构造函数 add操作 扩容函数 remove函数 subList函数 总结 本系列是Java详解,专栏地址:Java源码分析 ArrayList 官方文档:ArrayL ...

  5. Java源码详解三:Hashtable源码分析--openjdk java 11源码

    文章目录 注释 哈希算法与映射 线程安全的实现方法 put 操作 get操作 本系列是Java详解,专栏地址:Java源码分析 Hashtable官方文档:Hashtable (Java Platfo ...

  6. Java源码详解二:HashMap源码分析--openjdk java 11源码

    文章目录 HashMap.java介绍 1.HashMap的get和put操作平均时间复杂度和最坏时间复杂度 2.为什么链表长度超过8才转换为红黑树 3.红黑树中的节点如何排序 本系列是Java详解, ...

  7. JAVA源码优化、分析工具

    JAVA源码优化.分析工具 一.11款用于优化.分析源代码的Java工具 1. PMD from http://pmd.sourceforge.net/ PMD能够扫描Java 源代码,查找类似以下的 ...

  8. python打蛇_hprose for java源码分析-1 初识

    1.1初识 hprose是个开源RPC框架.支持语言 JAVA, C#,C++,Python,PHP等一系列语言.这里着重分析下hprose for java源码. 可以到https://github ...

  9. 【Java源码分析】Java8的HashMap源码分析

    Java8中的HashMap源码分析 源码分析 HashMap的定义 字段属性 构造函数 hash函数 comparableClassFor,compareComparables函数 tableSiz ...

最新文章

  1. opencv-python图像处理之素描
  2. 在一个TextArea中如何限制行数和字符数
  3. #191 sea(动态规划)
  4. 三次握手wireshark抓包分析,成功握手和失败握手
  5. Objective-C 2.0 with Cocoa Foundation--- 8,类方法以及私有方法
  6. C#LeetCode刷题之#463-岛屿的周长​​​​​​​(Island Perimeter)
  7. 02-通过修改映射在本地模拟Eureka集群
  8. KCC创建复制拓扑失败-故障处理
  9. 用PLC和触摸屏设计用户可编程的控制项目
  10. 作为一名优秀的软件测试工程师,需要具备哪些能力?
  11. id门禁卡复制到手机_使用iPhone解锁开门?手机复制门禁卡教程分享
  12. ubuntu18.04使用网易云音乐 ubuntu网易云音乐打不开怎么办? ubuntu安装网易云音乐
  13. 计算机桌面个性化怎样设置方法,终于知晓如何设置个性化电脑桌面?
  14. 字符串类型及format格式化
  15. 微博封禁117个百万大V账号!
  16. 抖音招商团长怎么做?怎么入驻?
  17. 浅谈汽车OTA的现状与未来发展趋势
  18. 华中科技大学计算机网络教材,华中科技大学计算机网络复习资料.ppt
  19. HDOj 4544
  20. IBM X服务器BIOS 使用说明

热门文章

  1. C#判断上班时间和下班时间(含周末)的方法实现
  2. python中for和else的用法_Python循环结构中else用法(入门必读)
  3. Tornado框架基础
  4. Tmall商品详情API接口代码对接教程
  5. How to Compile mpc
  6. win10下CUDA和cuDNN的安装(超详细)
  7. Element下拉框自定义搜索方法
  8. 数据矩阵及R语言的表示
  9. LLM底座模型:LLaMA、Palm、GLM、BLOOM、GPT结构对比
  10. #创新实训#VR漫游项目汇报1