code: public synchronized static <T> Set<T> getSubclassInstances(Class<T> parentClass, String... packageNames) {
          return getNonAbstractSubClasses(parentClass, packageNames).stream()
                  .filter(subclass -> {
                      if (Reflection.canInitiate(subclass)) {
                          return true;
                      } else {
                          System.out.println(subclass + " can not be initiated, ignored.");
                          return false;
                      }
                  })
                  .map(subclass -> {
                      try {
                          return subclass.newInstance();
                      } catch (InstantiationException | IllegalAccessException e) {
                          e.printStackTrace();
                          return null;
                      }
                  }).collect(Collectors.toSet());
      }
docs: search and create new instances of concrete subclasses, 1 for each.
  Note that we only initiate subclasses which are with default constructor, those without default constructors
  we judge them as canInitiate=false.
  
  @param parentClass  parent class
  @param packageNames package name prefix
  @param <T>          class generic type
  @return a set of subclass instances