Mybatis MetaObject

  1. /**
  2. * @author Clinton Begin
  3. */
  4. public class MetaObject {
  5. /**
  6. * 原始的数据对象,初始化时的对象
  7. */
  8. private final Object originalObject;
  9. /**
  10. * 对象包装
  11. */
  12. private final ObjectWrapper objectWrapper;
  13. /**
  14. * object 工厂
  15. */
  16. private final ObjectFactory objectFactory;
  17. /**
  18. * object
  19. */
  20. private final ObjectWrapperFactory objectWrapperFactory;
  21. /**
  22. * 反射工程
  23. */
  24. private final ReflectorFactory reflectorFactory;
  25. private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
  26. this.originalObject = object;
  27. this.objectFactory = objectFactory;
  28. this.objectWrapperFactory = objectWrapperFactory;
  29. this.reflectorFactory = reflectorFactory;
  30. // 根据object不同实例进行不同的实例化方式
  31. if (object instanceof ObjectWrapper) {
  32. this.objectWrapper = (ObjectWrapper) object;
  33. } else if (objectWrapperFactory.hasWrapperFor(object)) {
  34. this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object);
  35. } else if (object instanceof Map) {
  36. this.objectWrapper = new MapWrapper(this, (Map) object);
  37. } else if (object instanceof Collection) {
  38. this.objectWrapper = new CollectionWrapper(this, (Collection) object);
  39. } else {
  40. this.objectWrapper = new BeanWrapper(this, object);
  41. }
  42. }
  43. public static MetaObject forObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
  44. if (object == null) {
  45. return SystemMetaObject.NULL_META_OBJECT;
  46. } else {
  47. return new MetaObject(object, objectFactory, objectWrapperFactory, reflectorFactory);
  48. }
  49. }
  50. /**
  51. * 获取value
  52. * @param name 属性值名称
  53. * @return
  54. */
  55. public Object getValue(String name) {
  56. PropertyTokenizer prop = new PropertyTokenizer(name);
  57. if (prop.hasNext()) {
  58. MetaObject metaValue = metaObjectForProperty(prop.getIndexedName());
  59. if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
  60. // 判断是否是空的metaObject
  61. return null;
  62. } else {
  63. return metaValue.getValue(prop.getChildren());
  64. }
  65. } else {
  66. return objectWrapper.get(prop);
  67. }
  68. }
  69. /**
  70. * metaObject 设置属性值方法
  71. * {name:value}
  72. *
  73. * @param name 属性值名称
  74. * @param value 属性值
  75. */
  76. public void setValue(String name, Object value) {
  77. PropertyTokenizer prop = new PropertyTokenizer(name);
  78. if (prop.hasNext()) {
  79. // 获取属性实例
  80. MetaObject metaValue = metaObjectForProperty(prop.getIndexedName());
  81. if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
  82. if (value == null) {
  83. // value 空则返回
  84. // don't instantiate child path if value is null
  85. return;
  86. } else {
  87. // 创建属性值
  88. metaValue = objectWrapper.instantiatePropertyValue(name, prop, objectFactory);
  89. }
  90. }
  91. metaValue.setValue(prop.getChildren(), value);
  92. } else {
  93. objectWrapper.set(prop, value);
  94. }
  95. }
  96. }