使⽤javaparser分析重构java源码
为什么需要⼀个这样的⼯具?
有时候我想要⼀个辅助我对现有java⼯程代码进⾏全⾯改造的⼯具,⽽这种改造⼯作⽐较精细特别,需要我做⼀些定制操作,⽽且现有的IDE内置⼯具没有提供这种特定化的改造功能。这时我就想,为了做这种改造,可以使⽤什么思路呢?
1.使⽤正则表达式查并替换
对于某些重构操作确实有⽤,但是对于某些复杂的代码结构却⽆法精准且⼀次性就替换完成,精细度⽐较有限
2.编译源码,利⽤反射API解析代码功能,从⽽收集到代码结构相关的信息
优点:操作⽅便,信息精准
缺点:a.需要依赖jdk编译环境,编译有⼀定耗时
b.若代码⽂件依赖jar缺失,编译⽆法继续,阻断代码分析
c.编译后丧失了源码⽂件的注释和变量名称等源码特有信息,也⽆法帮助确定调⽤所在⾏数
3.直接对源代码进⾏解析,形成⼤致的结构描述信息,能够帮助获取到依赖声明,类定义以及类成员定义信息,相关代码块所在起⽌位置,如果能够通过操作结构化的解析对象信息改变源码内容,就更有利于辅助代码重构了。
下⾯就让我尝试使⽤javaParser
1.新建java maven⼯程,引⼊依赖
<dependency>
<groupId>com.github.javaparser</groupId>
<artifactId>javaparser-core</artifactId>
<version>3.14.5</version>
</dependency>
解析:
CompilationUnit compilationUnit = StaticJavaParser.parse("class A { }");
Optional<ClassOrInterfaceDeclaration> classA = ClassByName("A");
分析:
compilationUnit.findAll(FieldDeclaration.class).stream()
.filter(f -> f.isPublic() && !f.isStatic())
.forEach(f -> System.out.println("Check field at line " +
转换:
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);
python转java代码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 = String();
PS:
甚⾄于我可以借助该⼯具实现某些不同编程语⾔代码向与ava代码相互转换的辅助⼯具,⽐如Python与Java的代码互转,虽说⽐较困难,但是实现⼀些⽐较简单通⽤的API互转当前还是可以做到的。这块现在我在gitee码云上在尝试去做,希望有朝⼀⽇能够实现⽐较可⽤的版本。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论