[問題] Java 反射機制於 compile 時檢查

作者: cyclone350 (老子我最神)   2015-09-27 18:38:18
大家好
java 專案裡面多多少少會使用到反射機制寫程式
比較常見的像是 criteria ...
例如程式碼
final CriteriaQuery<User> q = cb.createQuery(User.class);
final Root<User> users = q.from(User.class);
final Predicate condition = cb.equal(users.get("privilegeLevel"), 5);
q.select(users)
.where(condition)
.orderBy(cb.asc(users.get("userId")));
其中 privilegeLevel 會直接對應到 entity 的 field
若是 entity 修改 privilegeLevel 欄位名稱,在 compile 階段並不會檢查到
而到真正 runtime 時才會發現錯誤。
想請問有無方法可以在 compile 時可以檢查的 ?
(ide plugin 或 build tool plugin 都可)
除了 compile 檢查以下我目前知道以下幾種解法
1. 讓所有開發工程師都明白這件事情,在修改程式碼時會更小心注意。
2. 使用 http://goo.gl/zhhdLh 文章的方法。
3. 修改程式有發生錯誤的風險,所以不要修改程式。
方法 1... , 可讓發生錯誤降低,但無法保證不會發生...
方法 2... , 可以杜絕錯誤,但個人有點不愛,因為除了 Criteria 外還有 hql,
需要把整個專案(跟DB有關)翻掉重寫,我們專案沒有 test 流程,
若是人工修改人工測試,會消耗非常巨量的時間。
方法 3... , 最安全的做法,但我覺得同時也是最糟糕的做法。
三個方法要選的話我會選 1
不過目前想到最完美的方法就是有現成的 compile 時段就可以檢查的,
想請問各位前輩有無這種工具或套件,若沒有的話,你們專案是如何解決
這類問題的 !?
作者: NullLife (廢材大叔有點累)   2015-09-27 20:27:00
我覺得用ORM來說 改field的時候 就相當於下DDL改column名稱 也就等於你相關的SQL語句都必須修改除非用mapping啦,以JPA來說就有annotation可以不耦合field名稱 所以我覺得重點還是在為什麼要去修改名稱勒?SOGA 工具我是不曉得 但用Eclipse的時候 在字串那邊就可以用ctrl點看看有無link 我覺得這已經夠方便了 XD
作者: qrtt1 (有些事,有時候。。。)   2015-09-27 20:51:00
覺得寫 unit test 才是比較好的方法。
作者: wuliou (wuliou)   2015-09-27 22:02:00
我想你還是寫unit test吧
作者: bitlife (BIT一生)   2015-09-28 10:28:00
有陽春工具可解決本篇問題,但對寫在sql內的field/table名稱修改就沒用,方法是把所有table及fields在coding時期從db讀出來,每個table做成一個以table name為名的class,然後所有該table的欄位成為該對應class的final static字串假設需要A表格的b欄位,程式就寫A.b當table有變動,就重跑一次抓表格/欄位工具,哪裏編不過就知道了
作者: swpoker (swpoker)   2015-09-30 10:16:00
這種就只能執行時才能知道~所以unit test吧
作者: marsyang1 (Mars)   2015-10-01 18:33:00
http://stackoverflow.com/questions/3037593/how-to-generate-jpa-2-0-metamodel參考參考,我自己是用spring data,為了整合性使用query dsl,但做法都差不多。組query會是用metamodel的class,不會用反射
作者: adrianshum (Alien)   2015-10-08 09:29:00
我有想過用類似 Mockito 的做法寫Util 去 runtime生成 method name e.g.nameOf(c(Foo.class).method())不過因為某些原因沒有動手做。可以考慮不過 property name/variable name 真的有點難搞QueryDSL 應該是暫時最可行的做法了

Links booklink

Contact Us: admin [ a t ] ucptt.com