The essential features are four:
java.dyn.Dynamicwill accept any method call and turn it into an
invokedynamicinstruction, and the full range of such instructions can be spelled from Java code.
java.dyn.MethodHandlewill accept any argument and return types for a call to the method named
invoke, which means that Java code can spell the full range of method handle invocations.
java.dyn.Dynamicserves as a bare reference type: Anything implicitly converts to it, and it can be cast to anything, but it is not a subtype of
java.lang.Object. Its methods, of course, are those from point #1, so it is handy for forming invokedynamic calls.
The rationale is pretty simple: If we put some minimal support into Java for defining and using names in other languages, then Java can be used as a system programming language for implementing them. Otherwise, the system programming language will be assembled bytecode. (I like to visit ASM, but don't want to live there.) If that piques your interest (and if you read my blog, I suppose it might) do check out the wiki page.
Since I use NetBeans, I've also adapted the NetBeans Java frontend (so it won't keep putting red squigglies under code I know is correct). For those adventurous souls who are already willing and able to hack their NetBeans (and take all the pertinent risks!), here is a JAR to replace the corresponding one in the bowels of NetBeans 6.5. Obviously, be sure to place it only in a scratch copy of NetBeans that you can afford to burn. If you don't know what I'm talking about, you are lucky, and please don't hack your NetBeans!