注释:(1)getPropertyAccessor()方法调用getHandler( cls, propertyAccessors ),参数cls就是上面获取的class Person,propertyAccessors是OgnlRuntime类声明的静态变量。
(2)getHandler()方法首先在handlers查找时候有和class Person对象的属性访问器,如果有直接返回。
(3)重要的代码是for循环,首先查看当前的class在handlers是否有相应的值,如果没有获取当前calss的实现的接口,在查看这些接口是否有相应的值。
如果上面都没有找到,获取父类对象,然后再次遍历。
参数cls就是上面获取的class Person,没有实现别的接口,也没有继承其他的类。那属性访问器是怎么获得呢?
所有的类都会继承object,handlers保存了和object相对的属性访问器了。那这个属性访问器是什么时候添加进来的呢?
请看OgnlRuntime类中的静态方法
static
{
PropertyAccessor p = new ArrayPropertyAccessor();
setPropertyAccessor( Object.class, new ObjectPropertyAccessor() );
setPropertyAccessor( byte[].class, p );
setPropertyAccessor( short[].class, p );
setPropertyAccessor( char[].class, p );
setPropertyAccessor( int[].class, p );
setPropertyAccessor( long[].class, p );
setPropertyAccessor( float[].class, p );
setPropertyAccessor( double[].class, p );
setPropertyAccessor( Object[].class, p );
setPropertyAccessor( List.class, new ListPropertyAccessor() );
setPropertyAccessor( Map.class, new MapPropertyAccessor() );
setPropertyAccessor( Set.class, new SetPropertyAccessor() );
setPropertyAccessor( Iterator.class, new IteratorPropertyAccessor() );
setPropertyAccessor( Enumeration.class, new EnumerationPropertyAccessor() );
。。。。
} 到这里,就获得了属性访问器,继续往下看,属性访问器是怎么获取值的。
9、ObjectPropertyAccessor类中getProperty( context, source, name )代码:
public Object getProperty( Map context, Object target, Object oname ) throws OgnlException
{
Object result = null;
String name = oname.toString();
if ((result = getPossibleProperty(context, target, name)) == OgnlRuntime.NotFound) {
throw new NoSuchPropertyException(target, name);
}
return result;
}
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-32760-7.html
泄浊屎