/**
  * 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);
 }
  /**
   * A variation of {@link #getAccessor(org.springframework.messaging.Message, Class)} with a {@code
   * MessageHeaders} instance instead of a {@code Message}.
   *
   * <p>This is for cases when a full message may not have been created yet.
   *
   * @return an accessor instance of the specified type, or {@code null} if none
   * @since 4.1
   */
  @SuppressWarnings("unchecked")
  public static <T extends MessageHeaderAccessor> T getAccessor(
      MessageHeaders messageHeaders, Class<T> requiredType) {

    if (messageHeaders instanceof MutableMessageHeaders) {
      MutableMessageHeaders mutableHeaders = (MutableMessageHeaders) messageHeaders;
      MessageHeaderAccessor headerAccessor = mutableHeaders.getMessageHeaderAccessor();
      if (requiredType.isAssignableFrom(headerAccessor.getClass())) {
        return (T) headerAccessor;
      }
    }
    return null;
  }