Il problema qui è che il tuo concetto è completamente imperfetto. Stai assegnando una mappa alla Classe e non all'istanza con questa riga:
User.metaClass.dynamicAttributes = [:]
Per realizzare ciò che stai cercando di fare, devi fare quanto segue:
User.metaClass.propertyMissing = { String name ->
if (!delegate.dynamicAttributes) delegate.dynamicAttributes = [:]
delegate.dynamicAttributes[name]
}
User.metaClass.propertyMissing = { String name, value ->
if (!delegate.dynamicAttributes) delegate.dynamicAttributes = [:]
delegate.dynamicAttributes[name] = value
}
Sono sicuro che esiste un modo più semplice per farlo, ma quanto sopra mostra una soluzione in cui la mappa viene istanziata per istanza e non in tutte le istanze.