Java中的动态查找器?

Java中的动态查找器?,java,grails,groovy,gorm,Java,Grails,Groovy,Gorm,Groovy/Grails有一个非常简洁的特性*称为动态查找器,作为GORM的一部分,它使用“幻影方法”实现,其中它使用动态消息拦截器将消息字段化到对象,如果名称不是当前的实际方法,但匹配以下特定格式:(field+comparator)它将合成该逻辑的过滤器谓词方法。Groovy在“MethodMissing”方法中对此有一个特殊的支持,Grails/GORM使用该钩子添加了这个合成的查找器逻辑 例如,可以执行以下操作: students.gpaLessThan(3.0).nameLik

Groovy/Grails有一个非常简洁的特性*称为动态查找器,作为GORM的一部分,它使用“幻影方法”实现,其中它使用动态消息拦截器将消息字段化到对象,如果名称不是当前的实际方法,但匹配以下特定格式:(field+comparator)它将合成该逻辑的过滤器谓词方法。Groovy在“MethodMissing”方法中对此有一个特殊的支持,Grails/GORM使用该钩子添加了这个合成的查找器逻辑

例如,可以执行以下操作:

   students.gpaLessThan(3.0).nameLike("Smith").stateEquals("Iowa");
并从集合中获取筛选结果,这些方法都不是用户编写的

似乎可以在Java中做类似的事情(并行),使用动态代理进行消息截取和合成。我本来打算玩这个,但不知道是否有其他人已经做过类似的事情。此外,我想知道使用注释是否可以对这样的合成名称实现一些静态类型检查,因为注释至少可以生成包含方法引用的代码,然后编译器将对其进行检查


[*我不是Groovy用户,但我只是阅读了该功能的一些示例,因此我可能对Groovy实现细节的理解不正确。]

这将违反静态类型的原理

您可以考虑java 8,在这里可以像

一样过滤
Stream<Student> students = ...
students.filter( s->s.gpa<3.0 )
        .filter( s->like(s.name, "Smith") )
        .filter( s->s.state.equals("Iowa") );
Stream students=。。。
students.filter(s->s.gplike(s.name,“Smith”))
.filter(s->s.state.equals(“爱荷华州”);

看一看。它是一个基于java的框架,从Grails中获得了很多灵感。Roo有一个有趣的使用方面的动态查找器实现。

是的,我同意,而且更喜欢J8——这只是一个实验!(你给出了一个很好的例子!)关键是grails/rails会基于DynamicFinder生成一个查询,但是java8(它的用法类似于slick)会从db返回所有结果,然后用java进行过滤,这是不高效的。