0

Я работаю над рамкой Grails. Мне интересно, что как Grails метод класса домена являются динамическими сгенерированы для каждого домена класса приложения Grails, какGrails как методы автоматически или динамически создаются для класса домена?

графа, countBy, createCriteria, удалить, сброшенных, ошибки, ExecuteQuery, executeUpdate, существует , fetchMode, находка, FindAll, findAllBy, findAllWhere, findBy, findOrCreateBy, findOrCreateWhere, findOrSaveBy, findOrSaveWhere, findWhere, первых, получить, GETALL, getDirtyPropertyNames, getPersistentValue, hasErrors, hasMany, hasOne, идент, InstanceOf, isAttached, isDirty, наконец, список , listOrderBy, нагрузка, замок, слияния, чтения, обновления, сохранить, Validate, где withCriteria, withNewSession, withSession, withTransaction

ответ

-1

Это делается через metaprogramming, вы можете добавлять методы и свойства любого класса динамически.

Вы должны использовать это консервативно, чтобы избежать столкновений с другими библиотеками, пытающимися добавить один и тот же метод к одному классу.

Надеюсь, это поможет.

0

В Grails 3.x для расширения классов домена не используется метапрограммирование. Я думаю, что они используют AST вместо

+0

«В Grails 3.x метапрограммирование не используется для расширения классов домена». - Это не совсем так. Мы по-прежнему используем метапрограммирование времени выполнения для таких вещей, как динамические искатели, которые невозможно подстроить во время компиляции. Многие другие вещи, которые раньше выполнялись при метапрограммировании во время выполнения, были заменены решениями на основе признаков или пользовательскими преобразованиями АСТ, но метапрограммирование времени выполнения все еще используется в Grails 3. –

0

В последних версиях Grails методы, упомянутые в вопросе, определены в признаке, который Grails автоматически добавляет к вашим классам класса Groovy. См. https://github.com/grails/grails-data-mapping/blob/9c66dbfdec33311d768fc230e704150d213e87ab/grails-datastore-gorm/src/main/groovy/org/grails/datastore/gorm/GormEntity.groovy. Например, метод count() определен в https://github.com/grails/grails-data-mapping/blob/9c66dbfdec33311d768fc230e704150d213e87ab/grails-datastore-gorm/src/main/groovy/org/grails/datastore/gorm/GormEntity.groovy#L620.

Я надеюсь, что это поможет.