mybatis3.4.1源代码 - MetaObject、MetaClass

 

MetaObject:用于访问对象信息,如:读取对象属性、设置对象属性
MetaClass:用于访问类信息,如:获取gettter方法、获取setter方法

 

package cn.java.demo.ibatis.internal;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.executor.resultset.ResultSetWrapper;
import org.apache.ibatis.mapping.ResultMap;
import org.apache.ibatis.reflection.DefaultReflectorFactory;
import org.apache.ibatis.reflection.MetaClass;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.ReflectorFactory;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import org.apache.ibatis.reflection.factory.ObjectFactory;
import org.apache.ibatis.reflection.invoker.Invoker;
import org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory;
import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory;

import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 */
@Slf4j
public class ReflectorFactoryTest {


    public static void main(String[] args) throws SQLException {
        MetaObjectDemo metaObjectDemo = new MetaObjectDemo();


        // MetaObject
        {
            metaObjectDemo.getRowValue(null, null);
        }

        // MetaClass
        {
            OrderEntity orderEntity = new OrderEntity();
            MetaObject metaObject = metaObjectDemo.newMetaObject(orderEntity);
            MetaClassDemo metaClassDemo = new MetaClassDemo(metaObject, orderEntity);
            metaClassDemo.doSetInvoker();
            Object result = metaClassDemo.doGetInvoker();
            log.info("result = {}", result);
            log.info("orderEntity = {}", orderEntity);
        }
    }

    /**
     * @see org.apache.ibatis.reflection.wrapper.BeanWrapper#BeanWrapper(org.apache.ibatis.reflection.MetaObject, java.lang.Object)
     */
    static class MetaClassDemo {
        MetaClass metaClass;
        private Object object;
        protected static final Object[] NO_ARGUMENTS = new Object[0];

        public MetaClassDemo(MetaObject metaObject, Object object) {
            this.object = object;
            this.metaClass = MetaClass.forClass(object.getClass(), metaObject.getReflectorFactory());
        }

        /**
         * @return
         * @throws InvocationTargetException
         * @throws IllegalAccessException
         * @see org.apache.ibatis.reflection.wrapper.BeanWrapper# setBeanProperty(org.apache.ibatis.reflection.property.PropertyTokenizer, java.lang.Object, java.lang.Object)
         */
        private Object doSetInvoker() {
            try {
                Invoker method = metaClass.getSetInvoker("orderNo");
                Object[] params = {"orderNo_00"};
                method.invoke(object, params);
            } catch (Exception ex) {
                throw new RuntimeException(ex);
            }

            return null;
        }

        /**
         * @return
         * @throws InvocationTargetException
         * @throws IllegalAccessException
         * @see org.apache.ibatis.reflection.wrapper.BeanWrapper# getBeanProperty(org.apache.ibatis.reflection.property.PropertyTokenizer, java.lang.Object)
         */
        private Object doGetInvoker() {
            try {
                Invoker method = metaClass.getGetInvoker("orderNo");
                return method.invoke(object, NO_ARGUMENTS);
            } catch (Exception ex) {
                throw new RuntimeException(ex);
            }
        }
    }


    static class MetaObjectDemo {
        /**
         * 反射器工厂
         */
        private ReflectorFactory reflectorFactory = new DefaultReflectorFactory();

        /**
         * 对象工厂
         * objectFactory.create(resultType);
         */
        private ObjectFactory objectFactory = new DefaultObjectFactory();

        /**
         * 对象包装工厂
         * objectWrapperFactory.getWrapperFor(this, object);
         * <p>
         * org.apache.ibatis.reflection.wrapper.MapWrapper
         * org.apache.ibatis.reflection.wrapper.CollectionWrapper
         * org.apache.ibatis.reflection.wrapper.BeanWrapper
         */
        private ObjectWrapperFactory objectWrapperFactory = new DefaultObjectWrapperFactory();

        /**
         * @param rsw
         * @param resultMap
         * @return
         * @throws SQLException
         * @see org.apache.ibatis.executor.resultset.DefaultResultSetHandler# getRowValue(org.apache.ibatis.executor.resultset.ResultSetWrapper, org.apache.ibatis.mapping.ResultMap)
         */
        public Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap) throws SQLException {
            // OrderEntity
            {
                Object resultObject = createResultObject(OrderEntity.class);

                // 元对象
                final MetaObject metaObject = newMetaObject(resultObject);

                // 设置值
                metaObject.setValue("orderNo", "orderNo_000");

                // 打印
                log.info("resultObject = {}", resultObject);
            }

            // OrderEntity
            if (false) {
                Object resultObject = createResultObject(List.class);
                if (resultObject instanceof ArrayList) {
                    log.info("resultObject instanceof ArrayList");
                }

                final MetaObject metaObject = newMetaObject(resultObject);

                log.info("resultObject = {}", resultObject);
            }

            return null;
        }

        /**
         * @param object
         * @return
         * @see org.apache.ibatis.session.Configuration#newMetaObject(java.lang.Object)
         */
        public MetaObject newMetaObject(Object object) {
            return MetaObject.forObject(object, objectFactory, objectWrapperFactory, reflectorFactory);
        }

        /**
         * @param resultType
         * @return
         * @see org.apache.ibatis.executor.resultset.DefaultResultSetHandler# createResultObject(org.apache.ibatis.executor.resultset.ResultSetWrapper, org.apache.ibatis.mapping.ResultMap, java.util.List, java.util.List, java.lang.String)
         */
        private Object createResultObject(final Class<?> resultType) {
            MetaClass metaType = MetaClass.forClass(resultType, reflectorFactory);
            if (resultType.isInterface() || metaType.hasDefaultConstructor()) {
                return objectFactory.create(resultType);
            }

            return null;
        }
    }


    @Data
    static class OrderEntity {
        private Long id;
        private String orderNo;
        private Long userId;
        private BigDecimal payAmount;
    }
}

 

 

 

 

上一篇:Mybatis快速入门的代码实现及报错处理解决org.apache.ibatis.exceptions.PersistenceException


下一篇:java.lang.ClassNotFoundException: org.apache.ibatis.io.Resources/Sqlsession在maven项目下的解决