/ / parametre požiadavky väzby na argumenty akcie - grály, väzba údajov, bytecode

Parametre viazania požiadaviek na akčné argumenty - grails, data-binding, bytecode

V gráloch môžete deklarovať činnosť kontrolóra takto:

def create(Integer foo, Integer bar) {
}

A ak má vaša požiadavka HTTP pomenované parametre foo a bar s hodnotami, ktoré je možné previesť na Integer, parametrom budú priradené tieto hodnoty. Zaujímalo by ma, ako to Grails dokáže, pretože chápem, že na úrovni bytecode JVM nie sú formálne názvy parametrov metódy k dispozícii. Je to čarodejníctvo alebo niečo nesprávne chápem?

odpovede:

3 pre odpoveď č. 1

V zásade sa stane, že existuje ASTtransformácia, ktorá pridá novú metódu bez args a rovnakého názvu. Táto nová metóda má v sebe logiku robiť väzbu údajov na základe deklarovaných typov vašej „skutočnej“ metódy a potom túto metódu zavolať. Preto sú typy povinné (inak nie je možné vykonať konverziu) a preto nemôžete mať metódu preťaženia.

Neschopnosť mať preťažené metódy je však ľahké obísť. Povedzte, že ste chceli akciu

def foo(String bar)

a ďalší

def foo(String bar, Integer wahoo)

V tomto scenári ponechajte 2. metódu a skontrolujte, či wahoo je null.

Je tiež dôležité používať typy parametrov objektov, nie primitívne prvky. Ak používate int/long/boolean/atď. a nie je uvedený žiadny parameter, dostali by ste NPE (keďže nula nie je prijateľnou konverziou z null pre čísla a buď je nepravdivá pre booleans).

Slušný prehľad o tom, čo sa deje, môžete získať, keď dekompilováte triedu pomocou JD-GUI alebo iného dekompilátora.


1 pre odpoveď č. 2

Skutočnosť, že ovládače Grails sú triedy Groovy, pomáha dosť. Pri pohľade cez zdrojový kód pre radiče môžete vidieť, kde veľmi využíva transformácie AST, najmä MethodNode. Takže predtým, ako sa stane bytecode, je „čarodejníctvo“ hotové. :)