{"id":1572,"date":"2012-10-03T13:57:27","date_gmt":"2012-10-03T11:57:27","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1572"},"modified":"2012-10-03T13:57:27","modified_gmt":"2012-10-03T11:57:27","slug":"wie-funktioniert-eigentlich-invokedynamic","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2012\/10\/wie-funktioniert-eigentlich-invokedynamic\/","title":{"rendered":"Wie funktioniert eigentlich invokedynamic?"},"content":{"rendered":"<p>Bei invokedynamic sind viel weniger Typinformationen n\u00f6tig wie bei den anderen vier existierenden Bytecodes f\u00fcr Methodenaufrufe. Generiert wird der Bytecode zum Beispiel von Skriptsprachen, wenn Typinformationen fehlen. Die Compiler der Skriptsprachen nutzen Bytecode-Bibliotheken wie ASM (<a href=\"http:\/\/asm.ow2.org\/\">http:\/\/asm.ow2.org\/<\/a>) und umgehen den Java-Compiler zur Erstellung der Klassendateien.<\/p>\n<p>Der neue Bytecode ist die eine Seite. Aber wenn die Typinformationen fehlen, insbesondere der wichtige Empf\u00e4nger (wie PrintStream bei println()), wie kommt die JVM zur wirklichen Implementierung? Etwa bei unserem Beispiel von isEmpty(s), in dem es ein invokedynamic-Aufruf von s.length() gibt. Der Aufruf muss ja irgendwo landen.<\/p>\n<p>function isEmpty(s) { return s == null || s.length() == 0; }<\/p>\n<p>Zwei Dinge sind hier zus\u00e4tzlich n\u00f6tig. Das erste ist, dass es neben dem Aufruf von invokedynamic noch eine zus\u00e4tzliche Information im Bytecode gibt, n\u00e4mlich von einer <i>Bootstrap-Methode<\/i>. Findet die JVM zum ersten Mal ein invokedynamic, dann wei\u00df sie nicht, an wen der Aufruf geht und wendet sich an die Bootstrap-Methode. Zur passenden Auswahl der Zielmethode \u00fcbergibt die JVM an die Bootstrap-Methode Informationen \u00fcber Aufrufer und Name, sodass alle wichtigen Informationen zur Auswahl des Ziels vorhanden sind. Hier sind wir nun in der zweiten H\u00e4lfte, denn zus\u00e4tzlich zum neuen Bytecode gibt es ein neues Paket java.lang.invoke. Die Bootstrap-Methode spezifiziert mit der API des neuen Pakets die Zielmethode und gibt diese an die JVM weiter. Wenn das einmal geschehen ist, ist der Aufruf gebunden und die JVM ruft beim dynamischen Aufruf direkt die vom Bootstrap gelieferte Methode auf. Der genaue Ablauf bei den invokedynamic-Aufrufen dokumentiert das Paket.<\/p>\n<p>Der neue Bytecode muss von einer Java 7-JVM unterst\u00fctzt werden und wird von dynamischen Skriptsprachen generiert, um die Aufrufe schnell von der JVM ausf\u00fchren zu lassen. Normale Entwickler werden den neuen Bytecode kaum brauchen, und im Quellcode ist er eh nicht sichtbar.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bei invokedynamic sind viel weniger Typinformationen n\u00f6tig wie bei den anderen vier existierenden Bytecodes f\u00fcr Methodenaufrufe. Generiert wird der Bytecode zum Beispiel von Skriptsprachen, wenn Typinformationen fehlen. Die Compiler der Skriptsprachen nutzen Bytecode-Bibliotheken wie ASM (http:\/\/asm.ow2.org\/) und umgehen den Java-Compiler zur Erstellung der Klassendateien. Der neue Bytecode ist die eine Seite. Aber wenn die Typinformationen [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11],"tags":[],"class_list":["post-1572","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1572","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=1572"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1572\/revisions"}],"predecessor-version":[{"id":1573,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1572\/revisions\/1573"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1572"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1572"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1572"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}