code: public String getParamForAnnotation(Class<?> clazz) {
      try {
        return (String) clazz.getField("param").get("");
      } catch (NoSuchFieldException e) {
        try {
          return getFirstExistingParamName(
              StringUtils.onCommas().splitToList((String) clazz.getField("params").get(""))
                  .toArray(new String[]{}));
        } catch (NoSuchFieldException e1) {
          throw new ParameterException("Annotation " + clazz + " must have param or params field");
        } catch (IllegalAccessException e1) {
          throw new ParameterException("While fetching parameter from annotation " + clazz, e);
        }
      } catch (IllegalAccessException e) {
        throw new ParameterException("While fetching parameter from annotation " + clazz, e);
      }
    }
docs: Gets the parameter associated with an annotation. Provided with an annotation class, this will
  check first if it has a {@code String} field called {@code param}.  If it does, its value is
  returned. If not, it checks for a {@code String} field called {@code params}. If it exists, it
  is split on ",", the elements are trimmed, and the return value of {@link
  #getFirstExistingParamName(String[])} on the resulting array is returned. If neither is
  present, a {@link ParameterException} is thrown.
  
  The reason this hack-y thing exists is that it is often convenient for Guice annotations to
  include on the annotation the parameter typically used to set it when configuring from a param
  file. However, we cannot specify array valued fields on annotations, so we need to use a
  comma-separated {@code String}.