還在Java手寫set調用?快速自動生成方法瞭解下——自動生成Java dto的set方法調用代碼

1. 演示

在這裏插入圖片描述

如上圖所示,可以快速自動生成Java dto的set方法調用。

使用時只需要兩步:複製、執行,之後就可以粘貼生成好的set方法調用代碼(包括import、new語句等)。

2. 代碼地址

  • 生成set方法調用代碼的工程

https://github.com/Adrninistrator/GenSetterCallshttps://gitee.com/adrninistrator/GenSetterCalls

  • 示例工程

https://github.com/Adrninistrator/GenSetterCalls-examplehttps://gitee.com/adrninistrator/GenSetterCalls-example

3. 實現功能

3.1. 生成set方法調用

當Java dto中的字段較多時,逐個手工編寫字段的set方法的調用代碼是比較繁瑣的,有可能會出現遺漏或重複。

以下提供一種方法,能夠快速自動生成Java dto的set方法調用。

針對以下類,會生成其字段的set方法調用:

  • 指定的類及所有超類

例如C類繼承自B類,B類繼承自A類,在指定生成C類的set方法調用時,也會生成B類與A類的set方法調用。

  • 指定的類及所有超類引用的自定義類型

以上所述自定義類型指非基本類型,非數組類型,非枚舉類型,非以下包中的類"java.", “javax.”, “javafx.”, “com.sun”, “sun.”,非nonCustomPackage參數指定包中的類(後續說明)。

例如A類或其超類中引用了B類,在指定生成A類的set方法調用時,也會生成B類的set方法調用。

  • 指定的類及所有超類的集合、數組引用的自定義類型

例如A類或其超類中通過集合或數組引用了B類(如Map<String, B>,List<B>,Set<B>,Queue<B>,B[]等),在指定生成A類的set方法調用時,也會生成B類的set方法調用。

支持集合嵌套或多維數組中的自定義類型,如List<String, Map<String,B>>,B[][]等。

  • 被引用的自定義類型中引用的其他自定義類型

例如A類或其超類中引用了B類,B類中引用了C類,在指定生成A類的set方法調用時,也會生成B類與C類的set方法調用。

針對以下字段,會生成其set方法調用:

  • 滿足非public,非static,非final條件。

在生成set方法時,會顯示對應的字段類型,便於使用,示例如下。該功能可關閉,後續說明。

dtoCollections.setList1(List<String>);
dtoCollections.setMap1(Map<DtoParent, String>);

dtoParent.setA_b(String);
dtoParent.setA_c(int);

dtoChild.setB(Boolean);

3.2. 生成import語句

對於生成了set方法調用代碼的類,也會生成其對應的import語句。該功能可關閉,後續說明。

3.3. 生成new語句

對於生成了set方法調用代碼的類,也會生成其對應的new語句。支持內部類(靜態與非靜態)。

4. 支持版本

支持JDK 1.6及以上版本。

在Windows 7 x64 SP1操作系統,使用IntelliJ IDEA 2019.2.4 (Community Edition)、Eclipse IDE for Enterprise Java Developers 2019-06 (4.12.0)進行驗證(以下默認使用Windows操作系統)。

在macOS 10.14.4操作系統,使用Android Studio 3.5進行驗證。

5. 使用方法

5.1. 添加依賴jar包

在Java工程中,添加以下依賴Jar包,建議在工程的測試模塊添加。可以參考“GenSetterCalls-example”項目。

依賴Jar包的信息如下:

屬性名 屬性值
groupId com.github.adrninistrator
artifactId GenSetterCalls
version 0.0.1
  • 使用Maven
<dependency>
    <groupId>com.github.adrninistrator</groupId>
    <artifactId>GenSetterCalls</artifactId>
    <version>0.0.1</version>
    <scope>test</scope>
</dependency>
  • 使用Gradle
"com.github.adrninistrator:GenSetterCalls:0.0.1"
  • 不使用構建工具

maven中央倉庫下載地址如下:

https://search.maven.org/artifact/com.github.adrninistrator/GenSetterCalls/https://repo1.maven.org/maven2/com/github/adrninistrator/GenSetterCalls/

可下載Jar包後在IDE中手工添加依賴,步驟略。

5.2. 使用步驟

使用步驟主要爲兩步:

  • 複製需要生成set方法調用代碼的Java類信息;
  • 執行生成set方法調用代碼的類。

5.2.1. 複製Java類信息

5.2.1.1. 複製Java類信息推薦方法

在複製需要生成set方法調用代碼的Java類信息時,推薦使用以下方法。

5.2.1.1.1. 工程中的Java文件

對於工程中的Java文件,可使用IDE或操作系統複製文件的功能(複製後可在操作系統資源管理器中粘貼對應的文件)。

  • 在IDEA操作

在IDEA的“Project”窗口中,找到對應的Java文件,點擊“Copy”菜單(快捷鍵:Ctrl + C)。

在這裏插入圖片描述

  • 在Eclipse操作

在Eclipse的“Project Explorer”窗口中,找到對應的Java文件,點擊“Copy”菜單(快捷鍵:Ctrl + C)。

在這裏插入圖片描述

  • 在macOS中使用Android Studio操作

在macOS中使用Android Studio操作時,在Android Studio中複製文件後無法在操作系統資源管理器粘貼文件,在執行生成set方法調用代碼的類時,也無法從剪切板中獲取到Java文件信息,需要使用其他方式複製。

5.2.1.1.2. Jar包中的Java類
  • 在IDEA操作

對class文件,點擊“Copy Path”菜單(快捷鍵:Ctrl + Shift + C)。

在這裏插入圖片描述

  • 在Eclipse操作

對class文件,點擊“Copy Qualified Name”菜單。

在這裏插入圖片描述

5.2.1.2. 複製Java類信息支持的格式

在複製需要生成set方法調用代碼的Java類信息時,支持以下格式,可以根據實際情況選擇。

5.2.1.2.1. 複製工程中的Java文件
在操作系統資源管理器操作 對Java文件,進行復制操作
在IDEA操作 對Java文件,點擊“Copy”菜單(快捷鍵:Ctrl + C)
在Eclipse操作 對Java文件,點擊“Copy”菜單(快捷鍵:Ctrl + C)
複製的數據 複製的數據爲文件本身
支持類型 只支持工程中的Java文件
5.2.1.2.2. 複製工程中的Java文件完整路徑
在IDEA操作 對Java文件,點擊“Copy Path”菜單(快捷鍵Ctrl + Shift + C)
在Eclipse操作 對Java文件,點擊“Properties”(快捷鍵:Alt + Enter),複製彈出窗口的“Location”屬性
複製的數據格式示例 E:\code\GenSetterCalls-example\src\main\java\dto\DtoArray.java
支持類型 只支持工程中的Java文件
5.2.1.2.3. 複製Java類名/Jar包中類名完整路徑
在IDEA操作 對Java文件,點擊“Copy Reference”菜單(快捷鍵Ctrl + Alt + Shift + C) / 對Jar包中的class文件,點擊“Copy Path”菜單(快捷鍵Ctrl + Shift + C)
複製的數據格式示例 dto.DtoArray / C:\program\Java\jdk1.8.0_144\jre\lib\rt.jar!\java\util\ArrayList.class
支持類型 支持工程中的Java文件、Jar包中的Java類
5.2.1.2.4. 複製Java類名.class
在Eclipse操作 對Jar包中的class文件,點擊“Copy Qualified Name”菜單
複製的數據格式示例 java.util.ArrayList.class
支持類型 只支持Jar包中的Java類
5.2.1.2.5. 複製工程中的Java文件對應class文件完整路徑
複製的數據格式示例 E:\code\GenSetterCalls-example\out\production\classes\dto\DtoArray.class
支持類型 只支持工程中的Java文件

5.2.2. 執行生成set方法調用代碼的類

執行以下類,完成後生成的代碼會複製到剪切板,同時也會在標準輸出顯示。

com.github.adrninistrator.gensettercalls.gen.GenSetterCallsAuto
  • 在IDEA操作

在IDEA中執行上述類時,當使用Gradle時,“Use classPath of module”建議選擇工程的測試模塊。

  • 在Eclipse操作

在Eclipse中執行上述類時,可直接執行。

當使用Eclipse導入使用Maven的Java工程時,當上述依賴Jar包的“scope”設置爲“test”時,可能會導致執行GenSetterCallsAuto類時提示找不到類,需要將“<scope>test</scope>”註釋或刪除。

5.3. 批量生成set方法調用代碼

可以執行GenSetterCalls類的handleClasses()方法,支持批量生成指定類的set方法調用代碼,傳入參數可爲Class數組,或完整類名數組。

在執行完成後,會在標準輸出顯示生成的代碼,不會複製到剪切板。

可參考“GenSetterCalls-example”項目,TestClassArray、TestClassNameArray類。

6. 參數說明

在執行GenSetterCallsAuto或GenSetterCalls類時,支持指定以下JVM參數,示例如下:

-Ddebug=1 -Dsort=1 -DhideType=1 -DhideImport=1 -DnonCustomPackage=dto.,dto1.
  • debug

當未指定該參數或爲空值時,不會輸出調試信息(默認情況);
當該參數爲非空值時,會輸出調試信息。

  • sort

當未指定該參數或爲空值時,生成set方法時使用變量聲明的順序(默認情況);
當該參數爲非空值時,生成set方法調用代碼時按照變量名稱進行正向排序。

  • hideType

當未指定該參數或爲空值時,在生成set方法調用代碼時會同時生成參數類型,例如“testC.setList1(List<String>);”(默認情況);
當該參數爲非空值時,在生成set方法調用代碼時不會生成參數類型,例如“testC.setList1();”。

  • hideImport

當未指定該參數或爲空值時,會生成對應類的import語句(默認情況);
當該參數爲非空值時,不會生成對應類的import語句。

  • nonCustomPackage

當未指定該參數或爲空值時,僅對於"java.", “javax.”, “javafx.”, “com.sun”, "sun."包中的類不會生成set方法調用代碼(默認情況);
當該參數爲非空值時,對於上述的包,及該參數指定的包中的類(也可指定類名),不會生成set方法調用代碼,該參數使用半角逗號“,”分隔。

7. 使用說明

  • 指定的類需要先完成編譯

對於指定的需要生成set方法調用的Java文件,需要完成編譯後,才能使用以上方法生成set方法調用,否則會提示找不到對應的類。

  • 複製多個文件

當複製多個文件後,在執行GenSetterCallsAuto類時,只會處理第一個文件。

  • 從IDEA拷貝後出現異常

當從IDEA中拷貝代碼後再執行GenSetterCallsAuto類時,會出現異常提示,不會影響正常使用,異常信息如下所示:

Exception "java.lang.ClassNotFoundException: com/intellij/codeInsight/editorActions/FoldingData"while constructing DataFlavor for: application/x-java-jvm-local-objectref; class=com.intellij.codeInsight.editorActions.FoldingData
  • 不支持多於一層的內部類

當指定的需要生成set方法調用代碼的Java類的內部類多於一層時,會提示“不支持多於一層的內部類”,生成的對應內部類的new語句僅包含類名簡稱。

例如對“GenSetterCalls-example”項目中的DtoInnerMulti類生成set方法調用時,會提示“不支持多於一層的內部類: dto.DtoInnerMulti$TestInnerM1$TestInnerM2”,TestInnerM2類對應的new語句爲“TestInnerM2 testInnerM2 = new TestInnerM2();”。

8. 與IDEA插件generateAllSetter對比

使用IDEA插件generateAllSetter也可以生成set方法調用代碼,但有以下限制(2.4版本):

  • dto需要有set方法,如果用了Lombok,dto中的字段無set方法時,generateAllSetter插件無法生成set方法調用代碼;

  • generateAllSetter插件在生成set方法調用代碼時,只能生成當前類及超類中的字段的set方法,對於引用的自定義類型,及集合、數組、引用的自定義類型中引用的自定義類型無法生成;

  • 需要先手寫對應對象的new語句;

  • 只能在IDEA中使用。

上述功能不存在以上限制。

9. 擴展

以“GenSetterCalls”項目代碼爲基礎,可以根據Java dto生成對應的接口文檔,例如使用自定義註解指定接口與字段描述等信息;在此基礎上,還可爲生成的set方法代碼自動添加註釋。

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