code: private <P> void introspectFields(Class<P> pojoClass, PojoDescriptorImpl<P> descriptor, List<AccessibleObject> nonPublicAccessibleObjects) {
  
      if (getFieldIntrospector() != null) {
        Iterator<Field> fieldIterator = getFieldIntrospector().findFields(pojoClass);
        while (fieldIterator.hasNext()) {
          Field field = fieldIterator.next();
          boolean fieldUsed = false;
          for (PojoPropertyAccessorBuilder<?> builder : getAccessorBuilders()) {
            PojoPropertyAccessor accessor = builder.create(field, descriptor, getDependencies());
            if (accessor != null) {
              boolean registered = registerAccessor(descriptor, accessor);
              if (registered) {
                fieldUsed = true;
              }
            }
          }
          if (fieldUsed && !isPublicAccessible(field)) {
            // reflective access that violates visibility
            nonPublicAccessibleObjects.add(field);
          }
          PojoPropertyDescriptorImpl propertyDescriptor = descriptor.getPropertyDescriptor(field.getName());
          if (propertyDescriptor != null) { // should actually never be null here...
            propertyDescriptor.setField(field);
          }
        }
      }
    }
docs: Introspects the {@link Field}s of the given {@link Class} and adds them to the given {@link PojoDescriptorImpl}.
  
  @param <P> is the generic type of {@code pojoClass}.
  @param pojoClass is the {@link Class} for the {@link PojoDescriptorImpl#getPojoType() pojo type}.
  @param descriptor is the {@link PojoDescriptorImpl} where to add {@link PojoPropertyAccessor}s for detected
  properties.
  @param nonPublicAccessibleObjects is the {@link List} where to add non-public {@link AccessibleObject}s.