code: @Override
      public T fromString(String input) throws IllegalArgumentException {
          try {
              return constructor.newInstance(input);
          } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
              LoggerFactory.getLogger(this.getClass())
                      .error("Cannot create an instance of {} from \"{}\"",
                              constructor.getDeclaringClass().getName(),
                              input,
                              e);
              if (e.getCause() != null) {
                  throw new IllegalArgumentException(e.getCause());
              } else {
                  throw new IllegalArgumentException(e);
              }
          }
      }
docs: Converts the given input to an object by using the constructor approach. Notice that the constructor must
  expect receiving a {@literal null} value.
  
  @param input the input, can be {@literal null}
  @return the instance of T
  @throws IllegalArgumentException if the instance of T cannot be created from the input.