code: public Signature spread(String[] names, Class<?>... types) {
          assert names.length == types.length : "names and types must be of the same length";
  
          String[] newArgNames = new String[argNames.length - 1 + names.length];
          System.arraycopy(names, 0, newArgNames, newArgNames.length - names.length, names.length);
          System.arraycopy(argNames, 0, newArgNames, 0, argNames.length - 1);
  
          MethodType newMethodType = methodType
                  .dropParameterTypes(methodType.parameterCount() - 1, methodType.parameterCount())
                  .appendParameterTypes(types);
  
          return new Signature(newMethodType, newArgNames);
      }
docs: Spread the trailing [] argument into its component type assigning given names.
  
  @param names names to use for the decomposed arguments
  @param types types to use for the decomposed arguments
  @return a new signature with decomposed arguments in place of the trailing array