小编mfo*_*ett的帖子

Groovy在这做什么?

我试图调试一些使用mixins的代码,我能够将我的问题减少到这个例子.我有一个父类,它通过mixin和从父类继承的子类接收方法.如果我尝试替换子类的实例上的方法,它可以工作,除非在替换之前在父类的实例上调用我正在替换的方法.如果它已被调用,那么我无法替换它

所以这段代码:

class M {
    protected foo() { println 'foo' }
}

@Mixin(M) class A {
 def bar() { foo() }
}

class B extends A {}

def b = new B()
def a = new A()
a.bar() //<-- comment out this line and see the difference
b.metaClass.foo = {println 'winning'}
b.bar()
Run Code Online (Sandbox Code Playgroud)

将产量:

FOO

FOO

但是如果你评论第13行(评论中注释掉的那一行),你会得到:

胜利

为什么会这样?我希望在Groovy的元类模型的上下文中有一些方法可行,但我不明白.

这是Groovy 1.8.6

groovy inheritance metaclass mixins

9
推荐指数
1
解决办法
1683
查看次数

获取一对多加载对象的ID,而无需再使用GORM访问数据库

我必须使用与数据库表相关的GORM域,A和B. A与B具有一对多关系.因此,类看起来类似于:

class A {
   B b
   Long id
}

class B {
   Long id
}
Run Code Online (Sandbox Code Playgroud)

当我检索A的实例时,从数据库中检索相应B实例的ID.但是,当我尝试通过以下方式访问该ID时:

A a = A.get(11)
Long bid = a.b.id
Run Code Online (Sandbox Code Playgroud)

整个对象从数据库加载.在某些情况下,我只想要B的ID(已经检索过)并且不想从数据库加载整个实例.有没有办法从B获取ID而无需返回并获取整个对象.

注意:我知道它在a.b.id上面的行上进行了额外的提取,因为我可以看到自从我打开loggingSqlDataSource文件中的选项后生成的SQL .

grails groovy grails-orm

8
推荐指数
1
解决办法
1224
查看次数

从Groovy访问数据库架构信息

我试图围绕修改模式的代码包装一些Groovy测试.什么是习惯性的Groovy方法来获取有关数据库模式的信息(例如,确定表和主键上的列的名称和类型)?

database groovy database-schema

6
推荐指数
1
解决办法
2058
查看次数

在Groovy中记住成员方法

我有一个纯函数的方法,需要一段时间才能运行.我想记住这个方法,以便后续调用更快.我可以在Groovy的文档中看到你可以通过以下方式记住闭包:

foo = {…}.memoize()

但是,我找不到记忆成员方法的方法.有没有办法做到这一点?

methods groovy memoization

4
推荐指数
1
解决办法
1548
查看次数