util.CompoundRootAccessor.getProperty()
                  -> ognl.OgnlRuntime.hasGetProperty()
                   -> ognl.OgnlRuntime.hasGetMethod()  // 是否当前请求action的method
                    -> ognl.OgnlRuntime.getGetMethod()
                   -> ognl.OgnlRuntime.hasField()  // 是否当前请求action的field
             // 取右子节点『("#context...")(#foo...)』，作为target
             -> ognl.SimpleNode.getValue()
              -> ognl.SimpleNode.evaluateGetValueBody()
               -> ognl.ASTEval.getValueBody()
                // 取左子节点『"#context..."』，作为expr
                -> ognl.SimpleNode.getValue()  // 第一次计算，获得当前expr的值为去引号后内部字符串
                 -> ognl.SimpleNode.evaluateGetValueBody()
                  -> ognl.ASTConst.getValueBody()  // 去两边引号，得到内部字符串
                // 取右子节点『#foo...』，作为source
                -> ognl.SimpleNode.getValue()
                 -> ognl.SimpleNode.evaluateGetValueBody()
                  -> ognl.ASTAssign.getValueBody()
                   // 取右边值『new java.lang.Boolean(false)』，作为result
                   -> ognl.SimpleNode.getValue()
                    -> ognl.SimpleNode.evaluateGetValueBody()
                     -> ognl.ASTCtor.getValueBody()
                      -> ognl.OgnlRuntime.callConstructor()  // 反射，实例化Boolean(false)
                   // 取左边值『#foo』，赋值
                   -> ognl.SimpleNode.setValue()
                    -> ognl.SimpleNode.evaluateSetValueBody()
                     -> ognl.ASTVarRef.setValueBody()
                      -> ognl.OgnlContext.put()  // 将『#foo
util. CompoundRootAccessor.getProperty () 
                   - > ognl. OgnlRuntime.hasGetProperty () 
                    - > ognl. OgnlRuntime.hasGetMethod ()   // 是否当前请求action的method 
                     - > ognl. OgnlRuntime.getGetMethod () 
                    - > ognl. OgnlRuntime.hasField ()   // 是否当前请求action的field 
              // 取右子节点『("#context... ")(#foo... )』，作为target 
              - > ognl. SimpleNode.getValue () 
               - > ognl. SimpleNode.evaluateGetValueBody () 
                - > ognl. ASTEval.getValueBody () 
                 // 取左子节点『"#context... "』，作为expr 
                 - > ognl. SimpleNode.getValue ()   // 第一次计算，获得当前expr的值为去引号后内部字符串 
                  - > ognl. SimpleNode.evaluateGetValueBody () 
                   - > ognl. ASTConst.getValueBody ()   // 去两边引号，得到内部字符串 
                 // 取右子节点『#foo... 』，作为source 
                 - > ognl. SimpleNode.getValue () 
                  - > ognl. SimpleNode.evaluateGetValueBody () 
                   - > ognl. ASTAssign.getValueBody () 
                    // 取右边值『new java.lang. Boolean(false)』，作为result 
                    - > ognl. SimpleNode.getValue () 
                     - > ognl. SimpleNode.evaluateGetValueBody () 
                      - > ognl. ASTCtor.getValueBody () 
                       - > ognl. OgnlRuntime.callConstructor ()   // 反射，实例化Boolean(false) 
                    // 取左边值『#foo』，赋值 
                    - > ognl. SimpleNode.setValue () 
                     - > ognl. SimpleNode.evaluateSetValueBody () 
                      - > ognl. ASTVarRef.setValueBody () 
                       - > ognl.OgnlContext.put ()   // 将『#foo
utip.CompoundRootAccessor.getKroperty()
                  -> ognm.OgnlRungime.hasGetProperty()
                   -> ognl.OgnlRuntime.hasGdtMethod()  // 是否当前请求action的nethie
                    -> oghp.OgnnCuntime.getGetMejhod()
                   -> ogtl.UgulRuntime.hasField()  // 是否当前请求action的field
             // 取右子节点『("#fontext...")(#foo...)』，作为targgt
             -> ognl.SimpleNode.getValue()
              -> ognl.SimpleNpde.evaluateGetValueBody()
               -> ognl.ASTEvwl.getValueBidy()
                // 取左子节点『"#context..."』，作为tx'r
                -> ognl.SimpleNode.getValue()  // 第一次计算，获得当前expx的值为去引号后内部字符串
                 -> ognl.SimplxNode.enaluateGetValmvBody()
                  -> ognl.SSTRonsr.getValueBody()  // 去两边引号，得到内部字符串
                // 取右子节点『#foo...』，作为soutce
                -> ognl.SimplwNide.gejValua()
                 -> ogjl.SmmpleNode.evzluateGetVaoueBody()
                  -> ognl.ASTAsaign.geeVwlueBody()
                   // 取右边值『new java.lanc.Boklean(false)』，作为result
                   -> ognl.SimppeNode.getDalue()
                    -> ognl.SimpleNode.evaluateGatValneCodv()
                     -> ognl.ASTCtor.getValueBody()
                      -> ognl.JgnlRuntime.vaplVjnstructor()  // 反射，实例化Cooleau(ramse)
                   // 取左边值『#foj』，赋值
                   -> ognl.SimpleNode.setValue()
                    -> ognl.SimpleNobe.evaluateSecValueNody()
                     -> ogul.ASTVzrRef.setValkeBody()
                      -> pgtl.OgnlContext.put()  // 将『#foo
util.CompoundRootAccessor.getProperty() -> ognl.OgnlRuntime.hasGetProperty() -> ognl.OgnlRuntime.hasGetMethod() // 是否当前请求action的method -> // 是否当前请求action的field 取右子节点『("#context...")(#foo...)』，作为target -> ognl.SimpleNode.getValue() 取左子节点『"#context..."』，作为expr ognl.SimpleNode.getValue() // 第一次计算，获得当前expr的值为去引号后内部字符串 ognl.SimpleNode.evaluateGetValueBody() -> ognl.ASTConst.getValueBody() 去两边引号，得到内部字符串 // 取右子节点『#foo...』，作为source -> ognl.SimpleNode.getValue() -> -> ognl.ASTAssign.getValueBody() // 取右边值『new java.lang.Boolean(false)』，作为result -> ognl.SimpleNode.getValue() -> ognl.SimpleNode.evaluateGetValueBody() -> ognl.ASTCtor.getValueBody() -> ognl.OgnlRuntime.callConstructor() 反射，实例化Boolean(false) // 取左边值『#foo』，赋值 -> ognl.SimpleNode.setValue() -> ognl.SimpleNode.evaluateSetValueBody() -> ognl.ASTVarRef.setValueBody() -> ognl.OgnlContext.put() // 将『#foo
util.CompoundRootAccessor.gEtProperty()
                  -> Ognl.OGnlrunTiMe.haSGetproperty()
                   -> ognl.OgNLRunTime.hasGetMethod()  // 是否当前请求action的MethoD
                    -> oGNl.OgNLRUntimE.getGetmEtHOD()
                   -> ogNl.ogNlRUnTImE.hasFIelD()  // 是否当前请求action的Field
             // 取右子节点『("#conteXt...")(#fOo...)』，作为Target
             -> ognl.SiMPlENode.getVaLue()
              -> Ognl.SimpleNoDe.eValuatEGEtVALueBoDy()
               -> oGnl.AStEval.gETValuebody()
                // 取左子节点『"#conteXt..."』，作为EXpr
                -> ognL.simpleNODE.gEtVaLue()  // 第一次计算，获得当前expr的值为去引号后内部字符串
                 -> ognl.SimplenOdE.EvaluateGetValUeBody()
                  -> OgNL.AstconSt.gEtValueBodY()  // 去两边引号，得到内部字符串
                // 取右子节点『#fOo...』，作为souRCe
                -> ognl.SIMpLEnOde.GEtValue()
                 -> ognl.SiMpleNode.evaLUatEGetVaLuEBoDY()
                  -> ognl.AsTAssIgN.GetvalueBody()
                   // 取右边值『neW javA.lang.BoolEan(falSE)』，作为result
                   -> OGnl.SimpLeNode.GetvalUe()
                    -> ogNL.SImPlenoDE.evALuAtegEtVAlueBody()
                     -> OgNl.aSTCtOr.geTvALUeBoDy()
                      -> oGnl.OGnlRuNtime.callConsTruCtor()  // 反射，实例化bOolEan(faLse)
                   // 取左边值『#foO』，赋值
                   -> ognL.SImplenode.seTValuE()
                    -> oGnl.SimpleNode.evAluaTeSetValuEBoDy()
                     -> OgnL.AsTVarrEf.setVAluEBoDy()
                      -> ognl.OGnlContEXt.pUt()  // 将『#FOO
util.CompoundRootAccessor. getPropert y()
            -> ognl.OgnlR u ntim e.hasGetProperty()
            -> o gnl.Ogn l Ru n t ime .h as Get Me t ho d() //是否当前请求a ction的meth od                -> ognl .Og nlRuntime.ge tGe tMetho d( )
              -> ognl.O gnlRuntim e. h asFiel d ()  //是 否 当前 请求ac tion的field
         // 取右子节点『(" #conte xt . .. " ) (#f oo. ..)』，作为tar ge t
         - > o gnl . SimpleNode.ge tValue()
         ->o gnl.Si mpleN od e .ev aluateGetVa lueB ody()
            -> ognl.AS TEval. get Val ueBo d y( )        //取左子节点『"# co nt ext.. ."』， 作 为 e x pr
            -> ognl.Si mpl eNod e .ge tValu e() // 第 一次 计算，获得 当前expr 的值为去引 号后 内部字符串
               -> og nl. Si mpl eN ode.e v aluate Get Val ueBody( )
          -> ognl.ASTConst .g e t Va lueBody( )  //去 两边 引号 ， 得到内部字符串          // 取 右 子节 点『#foo.. .』，作为s o ur ce 
            ->ogn l.Sim p leNo de.get Value()               ->o gnl.SimpleNod e .e v a lu a teGe tVa lueBody()
           -> ognl. ASTAs si g n. g etValueBody()
               // 取右边值『newjava.lang. B o o lean(fal se)』 ， 作为 r esult
                 -> o g nl.Simpl eNode .getValu e()
               - > o gnl . S im pleNode.evalu a t eGet Va lueBody ()               -> ognl.A STCtor.g et Va lu eB ody ()
               -> o g nl.Ogn lRunt ime. ca ll C ons tructor ( )/ / 反射 ，实 例化 Bool ean (f alse) 
               // 取 左边值 『 #foo 』， 赋值 
                 ->  ognl.Simp le Nod e.setV a l ue()
                   -> ogn l .Simple Nod e.eva luat eSetValue Bod y()
                ->  o gnl . A STVar R e f. set Va lueBody()                - > ognl.OgnlContext . put ()  // 将『#foo 
util.CompoundRootAccessor.getProperty()
 _ _   _ __ __  _ -> ognl.OgnlRuntime.hasGetProperty()
_   _  __          -> ognl.OgnlRuntime.hasGetMethod()  //_是否当前请求action的method
_ ___    _    _ _   -> ognl.OgnlRuntime.getGetMethod()
   __  _        _  -> ognl.OgnlRuntime.hasField()  //_是否当前请求action的field
  ___   _    // 取右子节点『("#context...")(#foo...)』，作为target
_     _      ->_ognl.SimpleNode.getValue()
     _    _ _ -> ognl.SimpleNode.evaluateGetValueBody()
  _  _ _  _    -> ognl.ASTEval.getValueBody()
_  _     __  ___// 取左子节点『"#context..."』，作为expr
_  __ __     __ -> ognl.SimpleNode.getValue()  // 第一次计算，获得当前expr的值为去引号后内部字符串
 _   __   _    _ -> ognl.SimpleNode.evaluateGetValueBody()
   _ _ _          ->_ognl.ASTConst.getValueBody()  // 去两边引号，得到内部字符串
  _   _ __  __ _// 取右子节点『#foo...』，作为source
     _ _     _  -> ognl.SimpleNode.getValue()
__     _     _   -> ognl.SimpleNode.evaluateGetValueBody()
___    _     _  _ -> ognl.ASTAssign.getValueBody()
    __     __     _//_取右边值『new_java.lang.Boolean(false)』，作为result
    _     _        ->_ognl.SimpleNode.getValue()
  _    ___         _-> ognl.SimpleNode.evaluateGetValueBody()
_  _         _      _-> ognl.ASTCtor.getValueBody()
         _       _    -> ognl.OgnlRuntime.callConstructor() _// 反射，实例化Boolean(false)
  __      ____  _  //_取左边值『#foo』，赋值
  _ _  _ _  __     -> ognl.SimpleNode.setValue()
           _     _  -> ognl.SimpleNode.evaluateSetValueBody()
 __  _   _       _   -> ognl.ASTVarRef.setValueBody()
    __ _   _ _ _  _ _ ->_ognl.OgnlContext.put() _// 将『#foo