Example 3
The Example 3
 class uses a Java lambda with our waitFor
method. The lambda doesn't do anything other than return true. It's equivalent to example 1.
public class Example3 { // simple lambda void example() throws InterruptedException { waitFor(() -> true); } }
The bytecode is super simple this time. It uses the invokedynamic
opcode to create the lambda at line 3 which is then passed to the invokestatic
opcode on the next line.
 void example() throws java.lang.InterruptedException; Code: 0: invokedynamic #2, 0 // InvokeDynamic #0:isSatisfied: ()LCondition; 5: invokestatic #3 // Method WaitFor.waitFor:(LCondition;)V 8: return
The descriptor for the invokedynamic
call is targeting the isSatisfied
method on the Condition
interface (line 3.).
What we're not seeing here is the mechanics of invokedynamic
. The invokedynamic
opcode is a new opcode to Java 7, it was intended to provide better support for...