使用javaparser分析重构java源码

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

有时候我想要一个辅助我对现有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码云上在尝试去做,希望有朝一日能够实现比较可用的版本。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值