docs: public static <T extends PropertyDispatcher> T getInstance(Class<T> cls, PropertySetterDispatcher dispatcher)
      {
          try
          {
              PropertyDispatcherClass annotation = cls.getAnnotation(PropertyDispatcherClass.class);
              if (annotation == null)
              {
                  throw new IllegalArgumentException("@"+PropertyDispatcherClass.class.getSimpleName()+" missing in cls");
              }
              Class<?> c = Class.forName(annotation.value());
              if (dispatcher == null)
              {
                  T t =(T) c.newInstance();
                  return t;
              }
              else
              {
                  Constructor<?> constructor = c.getConstructor(PropertySetterDispatcher.class);
                  return (T) constructor.newInstance(dispatcher);
              }
          }
          catch (InvocationTargetException | SecurityException | NoSuchMethodException | ClassNotFoundException | InstantiationException | IllegalAccessException ex)
          {
              throw new IllegalArgumentException(ex);
          }
      }