/**
  * Return a mutable {@code MessageHeaderAccessor} for the given message attempting to match the
  * type of accessor used to create the message headers, or otherwise wrapping the message with a
  * {@code MessageHeaderAccessor} instance.
  *
  * <p>This is for cases where a header needs to be updated in generic code while preserving the
  * accessor type for downstream processing.
  *
  * @return an accessor of the required type (never {@code null})
  * @since 4.1
  */
 public static MessageHeaderAccessor getMutableAccessor(Message<?> message) {
   if (message.getHeaders() instanceof MutableMessageHeaders) {
     MutableMessageHeaders mutableHeaders = (MutableMessageHeaders) message.getHeaders();
     MessageHeaderAccessor accessor = mutableHeaders.getMessageHeaderAccessor();
     if (accessor != null) {
       return (accessor.isMutable() ? accessor : accessor.createAccessor(message));
     }
   }
   return new MessageHeaderAccessor(message);
 }