private <P> FieldDescriptorImpl<BEAN, P> buildClassField(final ClassDescriptorImpl<BEAN> classMap, final Field field, final List<Method> methods,
final Class<P> fieldClass) {
final Class<?> realClass = field.getType();
Class<P> processedClass = (Class<P>) field.getType();
if (isOptional(realClass)) {
processedClass = getGenericClass(field.getGenericType());
}
final FieldDescriptorImpl<BEAN, P> classField = new FieldDescriptorImpl<>(field.getName(),
processedClass,
buildPropertyFieldWrapper(field),
getGetter(field, methods),
getSetter(field, methods, classMap.getMappedClass())
);
setIgnored(classField);
setColumnInfo(classField);
setIdentifier(classField);
setGeneratorInfo(classField);
setVersionInfo(classField);
setJsonInfo(classField);
this.logger.debug("DB column [" + classField.getColumnInfo().getDBColumnName() + "]" + " will be associated with object field ["
+ classField.getFieldName() + "]");
return classField;
}