docs: @SuppressWarnings({ "rawtypes", "unchecked" })
  	public Object getObject(NodeConfig rootNode, Class rootClass, Object rootObject) throws UnmarshalException, SecurityException {
  		Object targetObject = null;
  		try {
  			if (rootObject != null) {
  				Constructor constructor = rootClass.getConstructor(new Class[] { rootObject.getClass() });
  				targetObject = constructor.newInstance(rootObject);
  			} else {
  				targetObject = rootClass.newInstance();
  			}
  		} catch (Exception e) {
  			throw new UnmarshalException(e);
  		}
  
  		boolean isNalaObject = targetObject instanceof XmlObject ? true : false;
  
  		if (rootNode.hasChildren()) {
  			List childrenNode = rootNode.getChildrenNodes();
  			for (Iterator iterNode = childrenNode.iterator(); iterNode.hasNext();) {
  				NodeConfig nodeConfig = (NodeConfig) iterNode.next();
  				Field field = null;
  				try {
  					String fieldName = nodeConfig.getName();
  					field = rootClass.getDeclaredField(fieldName);
  					if (field == null) {
  						throw new UnmarshalException(String.format("Couldn't find field %s in %s", fieldName, rootClass.getName()));
  					}
  				} catch (SecurityException e) {
  					throw new UnmarshalException(e);
  				} catch (NoSuchFieldException e) {
  					throw new UnmarshalException(e);
  				}
  				String fieldType = field.getType().getName();
  				Object methodValue = null;
  				String methodName = Constant.SET_PREFIX + StringUtils.capitalize(nodeConfig.getName());
  
  				// 从如果字段类别为List<E>则从其参数化引用中取得E的类型
  				if (fieldType.equals(Constant.LIST_CLASS)) {
  					String listTypeName = field.getGenericType().toString();
  					fieldType = listTypeName.substring(Constant.LIST_CLASS.length() + 1, listTypeName.length() - 1);
  				}
  
  				ObjectValueCreator objectValueCreator = new ObjectValueCreator();
  
  				methodValue = objectValueCreator.getValue(fieldType, nodeConfig);
  
  				if (methodValue == null) {
  					// 如果字段类别是带有$(表示内部类)则采用先构造外部类, 然后通过外部类生成内部类实例
  					if (fieldType.indexOf('$') > 0) {
  						try {
  							methodValue = getObject(nodeConfig, Class.forName(fieldType), targetObject);
  						} catch (ClassNotFoundException e) {
  							throw new UnmarshalException(e);
  						}
  					} else {
  						try {
  							methodValue = getObject(nodeConfig, Class.forName(fieldType), null);
  						} catch (ClassNotFoundException e) {
  							throw new UnmarshalException(e);
  						}
  					}
  				}
  
  				try {
  					Method method = rootClass.getMethod(methodName, TypeConver.getTypeClass(fieldType));
  					if (method != null)
  						setMethod(method, targetObject, methodValue);
  				} catch (NoSuchMethodException e) {
  					if (validation) {
  						throw new UnmarshalException(e);
  					}
  				} catch (ClassNotFoundException e) {
  					if (validation) {
  						throw new UnmarshalException(e);
  					}
  				}
  			}
  
  		} else {
  			try {
  				Method method = rootClass.getMethod(Constant.SET_VALUE, String.class);
  				if (method != null)
  					setMethod(method, targetObject, rootNode.getValue());
  			} catch (NoSuchMethodException e) {
  				if (validation) {
  					throw new UnmarshalException(e);
  				}
  			}
  		}
  		if (rootNode.hasAttributes()) {
  			setAttribute(rootNode, targetObject);
  		}
  
  		if (isNalaObject) {
  			setNameSpaces(rootNode, targetObject);
  		}
  
  		return targetObject;
  	}