Groovy метапрограммирование - PullRequest
       32

Groovy метапрограммирование

1 голос
/ 29 августа 2010

В проекте Service of Grails мне нравится находить во время выполнения аргументы динамических методов для информирования вызывающих абонентов.

Кроме того, мне нравится вызывать метод и, если он не существует, возвращать ошибку,

Я прошу любую помощь.

Ответы [ 2 ]

2 голосов
/ 01 сентября 2010

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

  • В вашем urlMappings.groovy определите отображениес двумя встроенными переменными объект и метод

    "/ $ объект / $ метод" (контроллер: "api", действие: "invoke")

  • Определить 'apiконтроллер с действием вызова.Посмотрите код ниже с логикой о том, как вызвать метод для объекта

    import org.codehaus.groovy.grails.commons.ApplicationHolder as AH
    class ApiController {
        def invoke = {
            def object = params.object
            def method = params.method
            def args
            if(object) {
                def domainClass = AH.application.domainClasses.find{it.name == method}?.clazz
                if(domainClass.metaClass.getStaticMetaMethod(method,args)) {
                    domainClass.metaClass.invokeStaticMethod(target,input.method,args)  
                }
            }
        }
    }
    

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

"/$object/$id/$method" (controller:"api",action:"invoke")

-Ken

0 голосов
/ 30 августа 2010

Не уверен, что я понимаю ваш вопрос, но последняя часть о проверке, можете ли вы вызвать метод для объекта, это может быть сделано путем проверки метакласса объекта, с которым вы имеете дело, вот так.

obj.metaClass.respondsTo(obj, 'theMethodYouWantToCall')

obj - это объект, для которого вы хотите вызвать метод, а theMethodYouWantToCall - это имя метода, который вы хотите вызвать. RespondsTo вернет пустой список [], если метод, который вы пытаетесь вызвать, не найден

...