public final List<String> getSubProcessorNamesWithSpecifiedParent(
      Class<? extends PipeProcessor> parentClass) throws PipeException {
    return StreamSupport.stream(pipePluginMetaKeeper.getAllPipePluginMeta().spliterator(), false)
        .map(pipePluginMeta -> pipePluginMeta.getPluginName().toLowerCase())
        .filter(
            pluginName -> {
              try (PipeProcessor processor =
                  (PipeProcessor) pipeProcessorConstructor.reflectPluginByKey(pluginName)) {
                return processor.getClass().getSuperclass() == parentClass;
              } catch (Exception e) {
                return false;
              }
            })
        .collect(Collectors.toList());
  }
Get the registered subClasses names of the given parent {@link PipeProcessor}. This method is
usually used to dynamically pick one or more {@link PipeProcessor} as the "plugin" of the
parent class.

@param parentClass the parent {@link PipeProcessor} to be checked
@return All the pluginNames of the plugin's subClass
@throws PipeException if any exception occurs
iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/agent/plugin/PipePluginAgent.java