(2)把root设置到result 中,root是person对象。ognl
到这里其实复杂的逻辑没有,但是很重要,到这里,前面的几步主要是准备了ognl的三要素:
(1).expression求值表达式——首先会被解析成对象树:tree
(2).rootobject 根对象——默认的操作对象:root
(3).contextOGNL执行环境——OGNL执行的上下文环境:createDefaultContext(root)
4、getValue( tree, createDefaultContext(root), root, resultType ) 代码:
public static Object getValue( Object tree, Map context, Object root, Class resultType ) throws OgnlException
{
Object result;
OgnlContext ognlContext = (OgnlContext)addDefaultContext(root, context);
result = ((Node)tree).getValue( ognlContext, root );
if (resultType != null) {
result = getTypeConverter( context ).convertValue( context, root, null, null, result, resultType);
}
return result;
}
注释:(1)(OgnlContext)addDefaultContext(root, context)获取ognl上下文,请参照步骤3.2
(3)tree是SimpleNode类型,根据ognl上下文和root对象,获取值
5、SimpleNode.java --getValue()代码:
public final Object getValue( OgnlContext context, Object source ) throws OgnlException
{
if (context.getTraceEvaluations()) {
EvaluationPool pool = OgnlRuntime.getEvaluationPool();
Object result = null;
Throwable evalException = null;
Evaluation evaluation = pool.create(this, source);
context.pushEvaluation(evaluation);
try {
result = evaluateGetValueBody(context, source);
} catch (OgnlException ex) {
evalException = ex;
throw ex;
} catch (RuntimeException ex) {
evalException = ex;
throw ex;
} finally {
Evaluation eval = context.popEvaluation();
eval.setResult(result);
if (evalException != null) {
eval.setException(evalException);
}
if ((evalException == null) && (context.getRootEvaluation() == null) && !context.getKeepLastEvaluation()) {
pool.recycleAll(eval);
}
}
return result;
} else {
return evaluateGetValueBody(context, source);
}
} 注释:context.getTraceEvaluations()创建ognl上下文时候traceEvaluations= false;在上面的过程中没有设置 traceEvaluations,所以获取的值为false。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-32760-3.html
x)fighting