code: public Class getPropertyType(String propertyName) {
  		if (PropertyAccessorUtils.isIndexedProperty(propertyName)) {
  			int nestingLevel = PropertyAccessorUtils.getNestingLevel(propertyName);
  			if (JdkVersion.getMajorJavaVersion() >= JdkVersion.JAVA_15) {
  				Member accessor = getPropertyAccessor(getRootPropertyName(propertyName));
  				if (accessor instanceof Field) {
  					return GenericCollectionTypeResolver.getIndexedValueFieldType((Field) accessor, nestingLevel);
  				}
  				else {
  					Method accessorMethod = (Method) accessor;
  					MethodParameter parameter = new MethodParameter(accessorMethod,
  							accessorMethod.getParameterTypes().length - 1);
  					return GenericCollectionTypeResolver.getIndexedValueMethodType(parameter, nestingLevel);
  				}
  			}
  			else {
  				// we can only resolve array types in Java 1.4
  				Class type = getPropertyType(getRootPropertyName(propertyName));
  				for (int i = 0; i < nestingLevel; i++) {
  					if (type.isArray()) {
  						type = type.getComponentType();
  					}
  					else {
  						return Object.class; // cannot resolve type
  					}
  				}
  				return type;
  			}
  		}
  		else {
  			Member readAccessor = (Member) readAccessors.get(propertyName);
  			if (readAccessor instanceof Field) {
  				return ((Field) readAccessor).getType();
  			}
  			else if (readAccessor instanceof Method) {
  				return ((Method) readAccessor).getReturnType();
  			}
  			Member writeAccessor = (Member) writeAccessors.get(propertyName);
  			if (writeAccessor instanceof Field) {
  				return ((Field) writeAccessor).getType();
  			}
  			else if (writeAccessor instanceof Method) {
  				return ((Method) writeAccessor).getParameterTypes()[0];
  			}
  		}
  		return null;
  	}
docs: {@inheritDoc}