使用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碼雲上在嘗試去做,希望有朝一日能夠實現比較可用的版本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章