1. 演示
如上圖所示,可以快速自動生成Java dto的set方法調用。
使用時只需要兩步:複製、執行,之後就可以粘貼生成好的set方法調用代碼(包括import、new語句等)。
2. 代碼地址
- 生成set方法調用代碼的工程
https://github.com/Adrninistrator/GenSetterCalls 、 https://gitee.com/adrninistrator/GenSetterCalls 。
- 示例工程
https://github.com/Adrninistrator/GenSetterCalls-example 、 https://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方法代碼自動添加註釋。