private static void addDefaultsAndExtensions( Map<String, Set<Descriptors.FieldDescriptor>> e, Map<String, Object> defaultValueMap, Descriptors.Descriptor d) { for (Descriptors.FieldDescriptor fieldDescriptor : d.getExtensions()) { String containingType = fieldDescriptor.getContainingType().getFullName(); Set<Descriptors.FieldDescriptor> fieldDescriptors = e.get(containingType); if (fieldDescriptors == null) { fieldDescriptors = new LinkedHashSet<>(); e.put(containingType, fieldDescriptors); } fieldDescriptors.add(fieldDescriptor); if (fieldDescriptor.hasDefaultValue()) { defaultValueMap.put( fieldDescriptor.getContainingType().getFullName() + "." + fieldDescriptor.getName(), fieldDescriptor.getDefaultValue()); } } for (Descriptors.FieldDescriptor fieldDescriptor : d.getFields()) { if (fieldDescriptor.hasDefaultValue()) { defaultValueMap.put( d.getFullName() + "." + fieldDescriptor.getName(), fieldDescriptor.getDefaultValue()); } } for (Descriptors.Descriptor nestedType : d.getNestedTypes()) { addDefaultsAndExtensions(e, defaultValueMap, nestedType); } }