# Interface MethodBuilder

All Superinterfaces:
  `ClassFileBuilder<MethodElement, MethodBuilder>, Consumer<MethodElement>`

public sealed interface MethodBuilder extends ClassFileBuilder<MethodElement, MethodBuilder>
A builder for methods. The main way to obtain a method builder is via `ClassBuilder.withMethod(String, MethodTypeDesc, int, Consumer)`. `ClassBuilder.withMethodBody(String, MethodTypeDesc, int, Consumer)` is useful if no attribute on the method except `Code` needs to be configured, skipping the method handler.

Refer to `ClassFileBuilder` for general guidance and caution around the use of builders for structures in the `class` file format.

See Java Virtual Machine Specification:
  4.6 Methods
Since:
  24
See Also:
  - `MethodModel`
  - `MethodTransform`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `MethodBuilder`
  `transformCode(CodeModel code, CodeTransform transform)`
  Build the method body for this method by transforming the body of another method.
  `MethodBuilder`
  `withCode(Consumer<? super CodeBuilder> code)`
  Build the method body for this method.
  `default MethodBuilder`
  `withFlags(int flags)`
  Sets the method access flags.
  `default MethodBuilder`
  `withFlags(AccessFlag... flags)`
  Sets the method access flags.

  ### Methods declared in interface ClassFileBuilder

  `accept, constantPool, transform, with`
  Modifier and Type
  Method
  Description
  `default void`
  `accept(MethodElement e)`
  Integrates the member element into the structure being built.
  `ConstantPoolBuilder`
  `constantPool()`
  Returns the constant pool builder associated with this builder.
  `default MethodBuilder`
  `transform(CompoundElement<MethodElement> model, ClassFileTransform<?, MethodElement, MethodBuilder> transform)`
  Applies a transform to a compound structure, directing results to this builder.
  `MethodBuilder`
  `with(MethodElement e)`
  Integrates the member element into the structure being built.

  ### Methods declared in interface Consumer

  `andThen`
  Modifier and Type
  Method
  Description
  `default Consumer<MethodElement>`
  `andThen(Consumer<? super MethodElement> after)`
  Returns a composed `Consumer` that performs, in sequence, this operation followed by the `after` operation.

- ## Method Details

  - ### withFlags

    default MethodBuilder withFlags(int flags)
    Sets the method access flags. The `AccessFlag.STATIC` flag cannot be modified after the builder is created.
    Parameters:
      `flags` - the access flags, as a bit mask
    Returns:
      this builder
    Throws:
      `IllegalArgumentException` - if `flags` is not `u2`, or the `ACC_STATIC` flag is modified
    See Also:
      - `AccessFlags`
      - `AccessFlag.Location.METHOD`

  - ### withFlags

    default MethodBuilder withFlags(AccessFlag... flags)
    Sets the method access flags. The `AccessFlag.STATIC` flag cannot be modified after the builder is created.
    Parameters:
      `flags` - the access flags, as a bit mask
    Returns:
      this builder
    Throws:
      `IllegalArgumentException` - if the `ACC_STATIC` flag is modified, or if any flag cannot be applied to the `AccessFlag.Location.METHOD` location
    See Also:
      - `AccessFlags`
      - `AccessFlag.Location.METHOD`

  - ### withCode

    MethodBuilder withCode(Consumer<? super CodeBuilder> code)
    Build the method body for this method.
    Parameters:
      `code` - a handler receiving a `CodeBuilder`
    Returns:
      this builder
    See Also:
      - `CodeModel`

  - ### transformCode

    MethodBuilder transformCode(CodeModel code, CodeTransform transform)
    Build the method body for this method by transforming the body of another method.

    This method behaves as if:

        withCode(cob -> cob.transform(code, transform));

    Parameters:
      `code` - the method body to be transformed
      `transform` - the transform to apply to the method body
    Returns:
      this builder
    See Also:
      - `CodeTransform`