public static DeepHierarchyElement[] getDeepFieldHierarchy(Class<?> parentClass, String field,
                                                               HintContainer deepIndexHintContainer) {
        if (!MappingUtils.isDeepMapping(field)) {
            MappingUtils.throwMappingException("Field does not contain deep field delimitor");
        }

        StringTokenizer toks = new StringTokenizer(field, DozerConstants.DEEP_FIELD_DELIMITER);
        Class<?> latestClass = parentClass;
        DeepHierarchyElement[] hierarchy = new DeepHierarchyElement[toks.countTokens()];
        int index = 0;
        int hintIndex = 0;
        while (toks.hasMoreTokens()) {
            String aFieldName = toks.nextToken();
            String theFieldName = aFieldName;
            int collectionIndex = -1;

            if (aFieldName.contains("[")) {
                theFieldName = aFieldName.substring(0, aFieldName.indexOf("["));
                collectionIndex = Integer.parseInt(aFieldName.substring(aFieldName.indexOf("[") + 1, aFieldName.indexOf("]")));
            }

            PropertyDescriptor propDescriptor = findPropertyDescriptor(latestClass, theFieldName, deepIndexHintContainer);
            DeepHierarchyElement r = new DeepHierarchyElement(propDescriptor, collectionIndex);

            if (propDescriptor == null) {
                MappingUtils.throwMappingException("Exception occurred determining deep field hierarchy for Class --> "
                                                   + parentClass.getName() + ", Field --> " + field + ".  Unable to determine property descriptor for Class --> "
                                                   + latestClass.getName() + ", Field Name: " + aFieldName);
            }

            latestClass = propDescriptor.getPropertyType();
            if (toks.hasMoreTokens()) {
                if (latestClass.isArray()) {
                    latestClass = latestClass.getComponentType();
                } else if (Collection.class.isAssignableFrom(latestClass)) {
                    Class<?> genericType = determineGenericsType(parentClass.getClass(), propDescriptor);

                    if (genericType == null && deepIndexHintContainer == null) {
                        MappingUtils
                                .throwMappingException("Hint(s) or Generics not specified.  Hint(s) or Generics must be specified for deep mapping with indexed field(s). "
                                                       + "Exception occurred determining deep field hierarchy for Class --> "
                                                       + parentClass.getName()
                                                       + ", Field --> "
                                                       + field
                                                       + ".  Unable to determine property descriptor for Class --> "
                                                       + latestClass.getName() + ", Field Name: " + aFieldName);
                    }

                    if (genericType != null) {
                        latestClass = genericType;
                    } else {
                        latestClass = deepIndexHintContainer.getHint(hintIndex);
                        hintIndex += 1;
                    }
                }
            }
            hierarchy[index++] = r;
        }

        return hierarchy;
    }
There are some nasty bugs for introspection with generics. This method addresses those nasty bugs and tries to find proper methods if available
http://bugs.sun.com/view_bug.do?bug_id=6788525
http://bugs.sun.com/view_bug.do?bug_id=6528714

@param clazz      type to work on
@param descriptor property pair (get/set) information
@return descriptor
core/src/main/java/com/github/dozermapper/core/util/ReflectionUtils.java