[问题] 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