我试图调试一些使用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
我必须使用与数据库表相关的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 .
我试图围绕修改模式的代码包装一些Groovy测试.什么是习惯性的Groovy方法来获取有关数据库模式的信息(例如,确定表和主键上的列的名称和类型)?
我有一个纯函数的方法,需要一段时间才能运行.我想记住这个方法,以便后续调用更快.我可以在Groovy的文档中看到你可以通过以下方式记住闭包:
foo = {…}.memoize()
但是,我找不到记忆成员方法的方法.有没有办法做到这一点?
groovy ×4
database ×1
grails ×1
grails-orm ×1
inheritance ×1
memoization ×1
metaclass ×1
methods ×1
mixins ×1