neděle 2. srpna 2009

Reflexe - AOT

Třída TreeNode představuje uzel AOT, tedy objekty, metody, pole ale i "adresáře" jako třeba Forms. S její pomocí pak můžeme provádět akce, na jaké jsme zvyklí při ruční práci s AOT. Například tento kód vytvoří novou třídu a spustí ji:
#AOT
TreeNode nodeClasses = TreeNode::findNode(#ClassesPath);
TreeNode nodeClass;
TreeNode nodeMethod;
;

nodeClass = nodeClasses.AOTadd('NovaTrida');
nodeMethod = nodeClass.AOTadd('main');
nodeMethod.AOTsetSource(
   'public static void main(Args _args){;info("Bezi");}', true);
nodeClass.AOTsave();
nodeClass.AOTcompile();
nodeClass.AOTrun();
Příklad asi nepotřebuje mnoho komentáře. Makro #AOT obsahuje cesty k různým prvkům (nebo části cest, jako třeba '\%1\\Fields\\\%2'). Skupinu všech tříd, novou třídu i její metodu reprezentuje třída TreeNode. Díky této funkcionalitě lze například snadno vytvářet generátory kódu apod. Další užitečná věc je práce s vlastnostmi (Properties). Vlastnost vyhledáme podle jejího názvu a v tom nám pomůže další makro - #Properties.
#AOT
#Properties
TreeNode nodeBOM = TreeNode::findNode(#TablesPath + #AOTDelimiter + tableStr(BOM));
;
info(nodeBOM.AOTgetProperty(#PropertyCachelookup));
Obdobně lze vlastnosti i nastavovat:
tableNode.AOTsetProperty(
   #PropertyFormRef,
   menuitemDisplayStr(Form1));
tableNode.AOTsave();
Často je také potřeba procházet iterovat přes větší množství AOT uzlů. K tomu se hodí tyto třídy:
  • TreeNode - metody AOTfindChild(), AOTfirstChild(), AOTnextSibling() atd.
  • TreeNodeIterator - prochází přímé potomky. Lze získat voláním AOTiterator() na TreeNode.
  • TreeNodeTraverser - prochází potomky včetně nepřímých.
  • TreeNodeTraverserSource - potomek TreeNodeTraverser; prochází jen uzly obsahující zdrojový kód.
Některé zajímavé metody pro práci s uzly AOT naleznete ve tříde SysTreeNode. Je jasné, že TreeNode obsahuje funkcí daleko více, ale pro základní představu to stad stačí.

Žádné komentáře:

Okomentovat