package org.nutz.el.opt.object; import java.util.List; import java.util.Map; import org.nutz.el.ElException; import org.nutz.el.Operator; import org.nutz.el.obj.Elobj; import org.nutz.el.opt.RunMethod; import org.nutz.el.opt.TwoTernary; import org.nutz.lang.InvokingException; import org.nutz.lang.Lang; import org.nutz.lang.Mirror; import org.nutz.lang.util.Context; /** * 访问符:'.' * @author juqkai(juqkai@gmail.com) * */ public class AccessOpt extends TwoTernary implements RunMethod{ public int fetchPriority() { return 1; } public Object calculate() { //如果直接调用计算方法,那基本上就是直接调用属性了吧...我也不知道^^ Object obj = fetchVar(); if (obj == null) { throw new ElException("obj is NULL, can't call obj." + right); } if(obj instanceof Map){ Map<?,?> om = (Map<?, ?>) obj; if(om.containsKey(right.toString())){ return om.get(right.toString()); } } if (obj instanceof Context) { Context sc = (Context) obj; if (sc.has(right.toString())) { return sc.get(right.toString()); } } Mirror<?> me = Mirror.me(obj); return me.getValue(obj, right.toString()); } public Object run(List<Object> param) { Object obj = fetchVar(); Mirror<?> me = null; if (obj == null) throw new NullPointerException(); if (obj instanceof Class) { //也许是个静态方法 me = Mirror.me(obj); try { return me.invoke(obj, right.toString(), param.toArray()); } catch (InvokingException e) { throw e; } catch (Throwable e) { if (Lang.unwrapThrow(e) instanceof NoSuchMethodException) { me = Mirror.me(obj.getClass().getClass()); return me.invoke(obj, right.toString(), param.toArray()); } throw Lang.wrapThrow(e); } } else { me = Mirror.me(obj); return me.invoke(obj, right.toString(), param.toArray()); } } /** * 取得变得的值 */ public Object fetchVar(){ if(left instanceof Operator){ return ((Operator) left).calculate(); } if(left instanceof Elobj){ return ((Elobj) left).fetchVal(); } return left; } public String fetchSelf() { return "."; } }