Invokedynamic allows for more dynamic method dispatch at runtime. It works by adding a new bytecode called invokedynamic that defers method lookup to a bootstrap method specified by the developer. This gives developers control over how methods are looked up and invoked, enabling use cases like dynamic language implementation, lazy constants, delegates, multi-dispatch, and more. Languages like JRuby have seen significant performance improvements by using invokedynamic.