docs: public static <T extends TransactionalSetter> T getInstance(Class<T> cls, Object intf)
      {
          Class<?>[] interfaces = cls.getInterfaces();
          if (interfaces.length != 1)
          {
              throw new IllegalArgumentException(cls+" should implement exactly one interface");
          }
          boolean ok = false;
          if (!interfaces[0].isAssignableFrom(intf.getClass()))
          {
              throw new IllegalArgumentException(cls+" doesn't implement "+intf);
          }
          try
          {
              TransactionalSetterClass annotation = cls.getAnnotation(TransactionalSetterClass.class);
              if (annotation == null)
              {
                  throw new IllegalArgumentException("@"+TransactionalSetterClass.class.getSimpleName()+" missing in cls");
              }
              Class<?> c = Class.forName(annotation.value());
              T t =(T) c.newInstance();
              t.intf = intf;
              return t;
          }
          catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex)
          {
              throw new IllegalArgumentException(ex);
          }
      }