private void setPropertyValue(Object bean, String fieldName, Object value) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { Field foundField = findField(bean.getClass(), fieldName); if (foundField != null) { if ( !Modifier.isPublic(foundField.getModifiers())) { Method setter = getSetter(bean, foundField.getName(), foundField.getType()); setter.invoke(bean, prepareValue(value, setter.getParameterTypes()[0])); } else { foundField.set(bean, prepareValue(value, foundField.getType())); } } else { Method getter = findGetter(bean.getClass(), fieldName); if (getter == null) { String message = String.format("Cannot find a getter for %s.%s", bean.getClass().getCanonicalName(), fieldName); throw new PropertyException(message, bean.getClass(), fieldName); } String getterFieldName = getGetterFieldName(getter); Method setter = getSetter(bean, getterFieldName, getter.getReturnType()); setter.invoke(bean, prepareValue(value, setter.getParameterTypes()[0])); } }