Groovy/Grails 有一个非常简洁的特性*,称为动态查找器,它是 GORM 的一部分,使用“幻像方法”实现,它使用动态消息拦截器将消息传递给对象,如果名称不是当前的实际方法,但匹配特定格式:(字段+比较器)它将合成该逻辑的过滤谓词方法。Groovy 在“MethodMissing”方法中对此提供了特殊支持,Grails/GORM 使用该钩子添加了这个合成的查找器逻辑。
例如,可以执行以下操作:
students.gpaLessThan(3.0).nameLike("Smith").stateEquals("Iowa");
并从集合中获取过滤结果,这些方法都不是用户编写的。
似乎可以在 Java 中做类似(并行)的事情,使用消息拦截器和合成的动态代理。我打算玩这个,但想知道是否其他人已经做过这样的事情。此外,我想知道使用注解是否可以对此类合成名称实现一些静态类型检查,因为注解至少可以生成带有方法引用的代码,然后编译器将对其进行检查。
[*我不是 Groovy 用户,只是阅读了该功能的一些示例,因此我可能对 Groovy 的实现细节不正确。]