只要您引用真实版本,您就可以覆盖 getProperty 和 setProperty。将这样的代码添加到 BootStrap 以为所有域类添加拦截器:
class BootStrap {
def grailsApplication
def init = { servletContext ->
for (dc in grailsApplication.domainClasses) {
dc.class.metaClass.getProperty = { String name ->
// do stuff before access
def result
def metaProperty = delegate.class.metaClass.getMetaProperty(name)
if (metaProperty) {
result = metaProperty.getProperty(delegate)
}
else {
throw new MissingPropertyException(name, delegate.class)
}
// do stuff after access
result
}
dc.class.metaClass.setProperty = { String name, value ->
// do stuff before update
def metaProperty = delegate.class.metaClass.getMetaProperty(name)
if (metaProperty) {
metaProperty.setProperty(delegate, value)
}
else {
throw new MissingPropertyException(name, delegate.class)
}
// do stuff after update
}
}
}
def destroy = {}
}