private Optional<AnnotatedElement> findOriginalMethod(AnnotatedElement annotated) {
      if (annotated != null && predicate.test(annotated)) {
        return Optional.of(annotated);
      }

      if (annotated instanceof Field) {
        // for fields try to find corresponding method (maybe annotated with @Id)
        // usually field is defined in ImmutableFoo.Json class and implements Foo
        final Field field = (Field) annotated;
        final Optional<Method> maybe = Arrays.stream(field.getDeclaringClass().getMethods())
                .filter(m -> m.getParameterCount() == 0)
                .filter(m -> m.getName().equals(field.getName()))
                .findAny();

        return maybe.flatMap(this::findOriginalMethod);
      }

      if (!(annotated instanceof Method)) {
        // something else. We support only Fields and Methods
        return Optional.empty();
      }

      final Method method = (Method) annotated;

      if (predicate.test(method)) {
        return Optional.of(method);
      }

      final String name = method.getName();
      final Class<?>[] params = method.getParameterTypes();
      // check for all available interfaces
      for (Class<?> iface: TypeToken.of(method.getDeclaringClass()).getTypes().interfaces().rawTypes()) {
        try {
          final Method maybe = iface.getMethod(name, params);
          if (predicate.test(maybe)) {
            return Optional.of(maybe);
          }
        } catch(NoSuchMethodException ignore) {
          // continue
        }
      }

      return Optional.empty();
    }
Uses reflection to find original method marked with {@link Criteria.Id}.
criteria/mongo/src/org/immutables/criteria/mongo/bson4jackson/IdAnnotationModule.java