# Class INVOKEDYNAMIC

java.lang.Object
org.apache.bcel.generic.Instruction
org.apache.bcel.generic.CPInstruction
org.apache.bcel.generic.FieldOrMethod
org.apache.bcel.generic.InvokeInstruction
org.apache.bcel.generic.INVOKEDYNAMIC

All Implemented Interfaces:
  `Cloneable, ExceptionThrower, IndexedInstruction, LoadClass, StackConsumer, StackProducer, TypedInstruction`

public class INVOKEDYNAMIC extends InvokeInstruction
Class for INVOKEDYNAMIC. Not an instance of InvokeInstruction, since that class expects to be able to get the class of the method. Ignores the bootstrap mechanism entirely.

Since:
  6.0
See Also:
  - The invokedynamic instruction in The Java Virtual Machine Specification

- ## Field Summary

  ### Fields inherited from class CPInstruction

  `index`

  ### Fields inherited from class Instruction

  `length, opcode`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `INVOKEDYNAMIC(int index)`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `accept(Visitor v)`
  Call corresponding visitor method(s).
  `void`
  `dump(DataOutputStream out)`
  Dump instruction as byte code to stream out.
  `String`
  `getClassName(ConstantPoolGen cpg)`
  Override the parent method because our class name is held elsewhere.
  `Class<?>[]`
  `getExceptions()`
  `ReferenceType`
  `getReferenceType(ConstantPoolGen cpg)`
  Since InvokeDynamic doesn't refer to a reference type, just return `Object`, as that is the only type we can say for sure the reference will be.
  `protected void`
  `initFromFile(ByteSequence bytes, boolean wide)`
  Reads needed data (i.e., index) from file.

  ### Methods inherited from class InvokeInstruction

  `consumeStack, getArgumentTypes, getMethodName, getReturnType, getType, produceStack, toString`

  ### Methods inherited from class FieldOrMethod

  `getClassType, getLoadClassType, getName, getSignature`

  ### Methods inherited from class CPInstruction

  `getIndex, setIndex, toString`

  ### Methods inherited from class Instruction

  `copy, equals, getComparator, getLength, getName, getOpcode, hashCode, isValidByte, isValidShort, readInstruction, setComparator, toString`

  ### Methods inherited from class Object

  `clone, finalize, getClass, notify, notifyAll, wait, wait, wait`

- ## Constructor Details

  - ### INVOKEDYNAMIC

    public INVOKEDYNAMIC(int index)

- ## Method Details

  - ### accept

    public void accept(Visitor v)
    Call corresponding visitor method(s). The order is: Call visitor methods of implemented interfaces first, then call methods according to the class hierarchy in descending order, i.e., the most specific visitXXX() call comes last.
    Specified by:
      `accept` in class `Instruction`
    Parameters:
      `v` - Visitor object

  - ### dump

    public void dump(DataOutputStream out) throws IOException
    Dump instruction as byte code to stream out.
    Overrides:
      `dump` in class `CPInstruction`
    Parameters:
      `out` - Output stream
    Throws:
      `IOException` - Thrown when an I/O exception of some sort has occurred.

  - ### getClassName

    public String getClassName(ConstantPoolGen cpg)
    Override the parent method because our class name is held elsewhere. Note: Contrary to this method's name it does not return the class name of the invoke target; rather it returns the name of the method that will be used to invoke the Lambda method generated by this invoke dynamic instruction.
    Overrides:
      `getClassName` in class `InvokeInstruction`
    Returns:
      name of the referenced class/interface

  - ### getExceptions

    public Class<?>[] getExceptions()

  - ### getReferenceType

    public ReferenceType getReferenceType(ConstantPoolGen cpg)
    Since InvokeDynamic doesn't refer to a reference type, just return `Object`, as that is the only type we can say for sure the reference will be.
    Overrides:
      `getReferenceType` in class `FieldOrMethod`
    Parameters:
      `cpg` - the ConstantPoolGen used to create the instruction
    Returns:
      an ObjectType for `Object`
    Since:
      6.1

  - ### initFromFile

    protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException
    Reads needed data (i.e., index) from file.
    Overrides:
      `initFromFile` in class `CPInstruction`
    Parameters:
      `bytes` - input stream
      `wide` - wide prefix?
    Throws:
      `IOException` - may be thrown if the implementation needs to read data from the file