/*
* Copyright 2009-2012 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ibatis.reflection;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.reflection.factory.ObjectFactory;
import org.apache.ibatis.reflection.property.PropertyTokenizer;
import org.apache.ibatis.reflection.wrapper.BeanWrapper;
import org.apache.ibatis.reflection.wrapper.CollectionWrapper;
import org.apache.ibatis.reflection.wrapper.MapWrapper;
import org.apache.ibatis.reflection.wrapper.ObjectWrapper;
import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory;
/**
* @author Clinton Begin
*/
/**
* 元对象,各种get,set方法有点ognl表达式的味道
* 可以参考MetaObjectTest来跟踪调试,基本上用到了reflection包下所有的类
*
*/
public class MetaObject {
//有一个原来的对象,对象包装器,对象工厂,对象包装器工厂
private Object originalObject;
private ObjectWrapper objectWrapper;
private ObjectFactory objectFactory;
private ObjectWrapperFactory objectWrapperFactory;
private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory) {
this.originalObject = object;
this.objectFactory = objectFactory;
this.objectWrapperFactory = objectWrapperFactory;
if (object instanceof ObjectWrapper) {
//如果对象本身已经是ObjectWrapper型,则直接赋给objectWrapper
this.objectWrapper = (ObjectWrapper) object;
} else if (objectWrapperFactory.hasWrapperFor(object)) {
//如果有包装器,调用ObjectWrapperFactory.getWrapperFor
this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object);
} else if (object instanceof Map) {
//如果是Map型,返回MapWrapper
this.objectWrapper = new MapWrapper(this, (Map) object);
} else if (object instanceof Collection) {
//如果是Collection型,返回CollectionWrapper
this.objectWrapper = new CollectionWrapper(this, (Collection) object);
} else {
//除此以外,返回BeanWrapper
this.objectWrapper = new BeanWrapper(this, object);
}
}
public static MetaObject forObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory) {
if (object == null) {
//处理一下null,将null包装起来
return SystemMetaObject.NULL_META_OBJECT;
} else {
return new MetaObject(object, objectFactory, objectWrapperFactory);
}
}
public ObjectFactory getObjectFactory() {
return objectFactory;
}
public ObjectWrapperFactory getObjectWrapperFactory() {
return objectWrapperFactory;
}
public Object getOriginalObject() {
return originalObject;
}
//--------以下方法都是委派给ObjectWrapper------
//查找属性
public String findProperty(String propName, boolean useCamelCaseMapping) {
return objectWrapper.findProperty(propName, useCamelCaseMapping);
}
//取得getter的名字列表
public String[] getGetterNames() {
return objectWrapper.getGetterNames();
}
//取得setter的名字列表
public String[] getSetterNames() {
return objectWrapper.getSetterNames();
}
//取得setter的类型列表
public Class<?> getSetterType(String name) {
return objectWrapper.getSetterType(name);
}
//取得getter的类型列表
public Class<?> getGetterType(String name) {
return objectWrapper.getGetterType(name);
}
//是否有指定的setter
public boolean hasSetter(String name) {
return objectWrapper.hasSetter(name);
}
//是否有指定的getter
public boolean hasGetter(String name) {
return objectWrapper.hasGetter(name);
}
//取得值
//如person[0].birthdate.year
//具体测试用例可以看MetaObjectTest
public Object getValue(String name) {
PropertyTokenizer prop = new PropertyTokenizer(name);
if (prop.hasNext()) {
MetaObject metaValue = metaObjectForProperty(prop.getIndexedName());
if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
//如果上层就是null了,那就结束,返回null
return null;
} else {
//否则继续看下一层,递归调用getValue
return metaValue.getValue(prop.getChildren());
}
} else {
return objectWrapper.get(prop);
}
}
//设置值
//如person[0].birthdate.year
public void setValue(String name, Object value) {
PropertyTokenizer prop = new PropertyTokenizer(name);
if (prop.hasNext()) {
MetaObject metaValue = metaObjectForProperty(prop.getIndexedName());
if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
if (value == null && prop.getChildren() != null) {
// don't instantiate child path if value is null
//如果上层就是null了,还得看有没有儿子,没有那就结束
return;
} else {
//否则还得new一个,委派给ObjectWrapper.instantiatePropertyValue
metaValue = objectWrapper.instantiatePropertyValue(name, prop, objectFactory);
}
}
//递归调用setValue
metaValue.setValue(prop.getChildren(), value);
} else {
//到了最后一层了,所以委派给ObjectWrapper.set
objectWrapper.set(prop, value);
}
}
//为某个属性生成元对象
public MetaObject metaObjectForProperty(String name) {
//实际是递归调用
Object value = getValue(name);
return MetaObject.forObject(value, objectFactory, objectWrapperFactory);
}
public ObjectWrapper getObjectWrapper() {
return objectWrapper;
}
//是否是集合
public boolean isCollection() {
return objectWrapper.isCollection();
}
//添加属性
public void add(Object element) {
objectWrapper.add(element);
}
//添加属性
public <E> void addAll(List<E> list) {
objectWrapper.addAll(list);
}
}