Groovy / Grails有一个非常简洁的功能*称为动态查找器作为GORM的一部分,使用“幻像方法”实现,其中它使用动态消息拦截器将消息发送到对象,如果名称不是当前的实际的方法,但匹配特定格式:(字段+比较器)它将合成该逻辑的过滤谓词方法。 Groovy在“MethodMissing”方法中对此有特殊支持,Grails / GORM使用该钩子添加了这个合成的查找器逻辑。
例如,人们可以这样做:
students.gpaLessThan(3.0).nameLike("Smith").stateEquals("Iowa");
并从集合中获取过滤结果,并且这些方法都不是用户编写的。
似乎人们可以在Java中做类似的事情(并行),使用动态代理进行消息拦截和合成。我打算玩这个,但想知道其他人是否已经做过这样的事情。此外,我想知道是否使用注释可以对这样的合成名称实现一些静态类型检查,因为注释至少可以生成带有方法引用的代码,然后编译器会检查这些代码。
[*我不是Groovy用户,但只是阅读了这个功能的一些示例,所以我对Groovy实现细节可能不正确。]
答案 0 :(得分:1)
这将违背静态打字的理念。
您可以考虑使用Java 8,您可以在其中进行过滤,例如
Stream<Student> students = ...
students.filter( s->s.gpa<3.0 )
.filter( s->like(s.name, "Smith") )
.filter( s->s.state.equals("Iowa") );
答案 1 :(得分:1)
看看Spring Roo。它是一个基于Java的框架,从Grails中获取了很多灵感。 Roo有一个使用方面的动态查找器的有趣实现。