## Eclipse-Getter/Setter 工作需求有使用到Eclipse 在寫bean時封裝常常會需要生成Getter/Setter 又有公版格式的需求,稍微花了點時間研究Eclipse怎麼自定義生成內容 做個紀錄 ※ 這邊的Eclipse版本是2023-9 ## 1.基本使用 滑鼠右鍵(或**Alt**+**Shift**+**s**),點在Class畫面內,會出現這個選單 ![image](https://hackmd.io/_uploads/rkg3BigOkg.png) 點選Generate Getter and Setter會出現相關選項 ![image](https://hackmd.io/_uploads/r1_CSsl_kl.png) Eclipse會自動偵測Class內的屬性並出現生成Getter、Setter的選項 點選需要的按下確定就會自動生成如下 ![image](https://hackmd.io/_uploads/H13qIixdke.png) 就是基本的Getter、Setter ## 2.修改模板 Eclipse內有內建模板可以修改產出格式 選擇上方工具列:**window** > **preference** > **Java** > **code style** > **code template** 可以看到畫面有兩種類型,分別是comments(註解)、和code(就是生成內容) ![image](https://hackmd.io/_uploads/rJUJusxdJl.png) 點擊就可以看到預設生成的pattern,點edit做修改 ![image](https://hackmd.io/_uploads/BkwE_se_1g.png) ==${}== 是Eclipse內建變數呼叫方式 有幾種可以點**Insert Variavle**看,也都有解釋 ![image](https://hackmd.io/_uploads/By0T_jx_1g.png) 舉例假設變數類型都是String,希望生成Setter時不要直接賦值,把Null變空字串和去空白 就可以這樣寫 ![image](https://hackmd.io/_uploads/Hk58Kix_1e.png) ![image](https://hackmd.io/_uploads/rkX3YsxOyx.png) 點擊OK後Apply Close 再做一次1.的步驟,就可以看到生成格式改變了 ![image](https://hackmd.io/_uploads/BJ3RFsgOyx.png) 所有自動生成的Setter都會自動去除null和空白 但要注意這邊修改的內容只有Getter、Setter的body,如果在edit時自己打上類似這樣的完整方法 ```java= public void set${param}(String ${param}){ if(${field} == null) { ${field} = ""; } else { ${field} = ${param}.trim(); } } ``` 那生成結果還會在外面再包一層setter method,就會出錯 ![image](https://hackmd.io/_uploads/ByPcjsxd1e.png) comments的部分也一樣,點擊edit之後都可以自己編輯 ![image](https://hackmd.io/_uploads/BJhbnjx_Je.png) 一樣確認保存後,回到1.生成時要記得勾選下方選項 ![image](https://hackmd.io/_uploads/SktI3seOkx.png) 生成後就可以看到自動加上剛剛的註解格式 ![image](https://hackmd.io/_uploads/HkyYhol_1e.png) 這樣就可以自己更改生成Getter/Setter(或其他可以更改的類型)的內容和註解 像是改file註解,加上copyright和作者、時間 ![image](https://hackmd.io/_uploads/Sykl0jgdJe.png) 保存後隨便建個class,就可以看到自動生成註解 ![image](https://hackmd.io/_uploads/SyN-k3xukl.png) ## 3.模板變數以外的內容 真正開始修改模板後會發現一個問題,那就是Eclipse內建變數有限,能抓的內容就那些 舉例:屬性都會有註解,說明內容 ![image](https://hackmd.io/_uploads/rJeAJ2eO1e.png) 像這樣,但Eclipse是讀不到註解的內容 =="表單號"== 這幾個字 如果希望自動生成Getter/Setter時註解可以說明賦值取值對像 單靠基本的內建變數就沒辦法達成 希望自動生成後可以長這樣 ![image](https://hackmd.io/_uploads/B1Dvl2gdye.png) 這邊有幾種方法可以改: 1. 直接寫code硬轉java code(但就跟自動生成無關了) 2. 自己寫Eclipse插件(PDE),但太麻煩了 3. 直接改Eclipse的sourceCode ==(這邊用這個方法)== 要改源碼首先就是要找到源碼位置 可以從Eclipse安裝位置開始找看看有沒有類似的jar檔,xxx是不同版號或後綴 eclipse/plugins/org.eclipse.jdt.ui_xxx.jar(舊版Eclipse) eclipse/plugins/org.eclipse.jdt.core.manipulation_xxx.jar(新版Eclipse) <font style="color:red;">如果plugin底下沒東西、jar包不完整、很少 可以看看C:\Users\<你的用戶名>\.p2\pool 某些版本安裝是直接裝在用戶目錄下 </font> ![image](https://hackmd.io/_uploads/HkaMN3ed1e.png) 應該可以看到類似這樣的內容,先找有 **.source**結尾的jar檔 內容用7zip之類的壓縮工具打開應該就可以看到,是 **.java**檔 因為這邊要自己修改內容 如果不是 **.source**結尾的jar,內容都是 **.class**檔 可以確認底下是否有 ==org.eclipse.jdt.internal.corext.codemanipulation.GetterSetterUtil.java==這個檔案 ![image](https://hackmd.io/_uploads/r1iAEhed1e.png) 確認拿對的第一件事,==**先備份**==,避免改壞或出意外 好了之後就是要來修改內容 可以直接import jar進IDE ![image](https://hackmd.io/_uploads/HkWPr3edyl.png) ![image](https://hackmd.io/_uploads/BkZOB3x_1l.png) ![image](https://hackmd.io/_uploads/B1ScSneO1e.png) 引入之後應該就可以看到內容,然後找到==org.eclipse.jdt.internal.corext.codemanipulation.GetterSetterUtil.java== 先解紅字,把該引用的jar加入,不然後面編譯也不會過 要引用的jar一樣都在剛剛找到的資料夾下(eclipse/或.p2/下) ![image](https://hackmd.io/_uploads/Hk9vv3guJx.png) 但要注意,這邊除了上面的兩個包 **org.eclipse.core.runtime** **org.eclipse.jdt.core** 之外,還要多引入 **org.eclipse.equinox.common** 不然org.eclipse.core.runtime.CoreException會找不到 然後[找到目前使用版本的jar](#找到目前使用版本的jar) ![image](https://hackmd.io/_uploads/HyACv3gO1l.png) 主要就這三個 好了之後紅字應該就會消掉了,接下來就是要來修改comments的內容了 搜尋 ==CodeGeneration.getSetterComment==和 ==CodeGeneration.getGetterComment==兩段 都在下面加上這段 ```java= ISourceRange sr= field.getJavadocRange(); if (null != sr) { String filedComment= field.getSource(); filedComment= filedComment.substring(0, sr.getLength()).replaceAll("[\n,\r,*,/,\t]", "").trim(); comment= comment.replace("#{bare_field_comment}", filedComment); } ``` 其實就是拿到Javadoc原先的註解後用字串處理放上要加的comment,改完應該會長這樣 ![image](https://hackmd.io/_uploads/HJyCt3lOJe.png) Getter和Setter都一樣 好了之後就存檔,去找到編譯後的.class檔 ![image](https://hackmd.io/_uploads/HyX79hg_ke.png) 再來就可以把IDE關掉了 回到jar包存放位置,找到目前IDE使用的**org.eclipse.jdt.core.manipulation_xxx.jar**的包 ![image](https://hackmd.io/_uploads/rkff0he_Jx.png) 一樣 ==**先備份**==,如果稍後出問題再貼回來就好 打開後直接把剛剛改完編譯後的class檔按,覆蓋過**org.eclipse.jdt.internal.corext.codemanipulation.GetterSetterUtil.class** 然後就可以重開IDE了 之後一樣到Code Templates的地方 加上剛剛更改的替換字樣 ==#{bare_field_comment}== ![image](https://hackmd.io/_uploads/BJY3R3eukl.png) 儲存之後,生成看看Getter、Setter,應該就會生效了 ![image](https://hackmd.io/_uploads/Hkcz1pedyl.png) <font style="color:red;">**如果沒有生效或是點擊Generate Getter and Setter後沒有反應,代表有問題,先把備份的jar包貼回去,再確認內容有沒有弄錯,不然可能就是版本有更新這類修改方式了**</font> <font style="color:red;">**做完的.class可以自己留個備份,因為現在的更改只會在本機生效,後續如果有多部機器需要相同配置,可以省略前面步驟**</font> ## 找到目前使用版本的jar 開plugin之後如果看到同樣的包有一堆版號 (Eclipse如果有更新不會自動移除舊包,就會同時有多版存在) 確認方式就是點**Help** > **About Eclipse IDE** > **Installation Details** > 在**Installed Software**或是**Plug-ins**的地方搜尋包的名稱,就可以看到目前編譯器使用的包版號 ![image](https://hackmd.io/_uploads/BkHhh3l_1l.png)