code: private InjectorMethod createInvoker(String invokeeName, String invokeeTypeName,
        boolean hasInvokee, boolean isNative, boolean isThrowing, String invokerMethodName,
        String invokerPackageName, int invokerParamCount, MethodLiteral<?, ?> method,
        String returnTypeString, boolean returning, boolean isLongAccess)
        throws NoSourceNameException {
  
      List<String> invokerSignatureParams = new ArrayList<String>(invokerParamCount);
  
      if (hasInvokee) {
        invokerSignatureParams.add(invokeeTypeName + " invokee");
      }
  
      List<String> invokeeCallParams = new ArrayList<String>(method.getParameterTypes().size());
  
      int paramCount = 0;
      for (Key<?> paramKey : method.getParameterKeys()) {
        String paramName = ReflectUtil.formatParameterName(paramCount);
        // We cannot use the type literal of the key here: It is canonicalized
        // during key creation, destroying some information, for example
        // auto-boxing any primitives. This leads to type-mismatches when calling
        // into JSNI. Instead we'll access the parameter's original type.
        TypeLiteral<?> paramLiteral = method.getParameterTypes().get(paramCount);
        invokerSignatureParams.add(ReflectUtil.getSourceName(paramLiteral) + " " + paramName);
        invokeeCallParams.add(paramName);
        paramCount++;
      }
  
      String annotation = isLongAccess ? "@com.google.gwt.core.client.UnsafeNativeLong " : "";
  
      String invokerSignature = annotation + "public " + (isNative ? "native " : "")
          + returnTypeString + " " + invokerMethodName + "(" + join(", ", invokerSignatureParams)
          + ")";
  
      return new InvokerMethod(hasInvokee, invokeeCallParams, invokeeTypeName, invokerPackageName,
          invokerSignature, isNative, isThrowing, method, returning, returnTypeString);
    }
docs: Create an invoker method.  See {@link #createMethodCallWithInjection}.