private <T> void injectFields(T instance) {
        requireNonNull(instance);

        traverseFields(instance.getClass())
            .filter(f -> f.isAnnotationPresent(Inject.class)
                || f.isAnnotationPresent(InjectOrNull.class))
            .distinct()
            .forEachOrdered(field -> {
                final Object value;

                if (Injector.class.isAssignableFrom(field.getType())) {
                    value = this;
                } else {
                    value = find(
                        field.getType(),
                        field.isAnnotationPresent(Inject.class)
                    );
                }
                // Todo: log a warning that this is deprecated
                try {
                    final InjectorProxy injectorProxy = builder.proxyFor(instance.getClass());
                    injectorProxy.set(field, instance, value);
                } catch (final IllegalAccessException ex) {
                    final String err = String.format(
                        "Could not access field '%s' in class '%s' of " +
                            "type '%s'.",
                        field.getName(),
                        field.getDeclaringClass().getName(),
                        field.getType()
                    );

                    LOGGER_INSTANCE.error(ex, err);
                    throw new InjectorException(err, ex);
                }
            });
    }
Create a new {@link InjectorBuilder} using the default implementation but
with a specific {@code ClassLoader}.

@param classLoader the class loader to use
@return the injector builder
common-parent/injector/src/main/java/com/speedment/common/injector/internal/InjectorImpl.java