Metode default memerlukan perubahan pada bytecode dan JVM sehingga tidak mungkin dilakukan di Java 7. Pemverifikasi bytecode Java 7 dan di bawahnya akan menolak antarmuka dengan badan metode (kecuali untuk metode penginisialisasi statis). Mencoba meniru metode default dengan metode statis di sisi pemanggil tidak akan memberikan hasil yang sama, karena metode default dapat ditimpa di subkelas. Retrolambda memiliki dukungan terbatas untuk melakukan backporting metode default, namun tidak pernah dapat dibackport sepenuhnya karena benar-benar memerlukan fitur JVM baru.
Lambdas dapat berjalan di Java 7 apa adanya, jika kelas API yang diperlukan ada di sana. Instruksi invokedynamic ada di Java 7, tetapi lambda dapat diimplementasikan sehingga menghasilkan kelas lambda pada waktu kompilasi (pembangunan JDK 8 awal melakukannya seperti itu) dalam hal ini instruksi tersebut akan berfungsi pada versi Java apa pun. (Oracle memutuskan untuk menggunakan invokedynamic untuk lambda untuk pemeriksaan di masa mendatang; mungkin suatu hari nanti JVM akan memiliki fungsi kelas satu, sehingga invokedynamic dapat diubah untuk menggunakannya alih-alih membuat kelas untuk setiap lambda, sehingga meningkatkan kinerja.) Apa yang dilakukan Retrolambda adalah bahwa ia memproses semua instruksi invokedynamic dan menggantinya dengan kelas anonim; sama seperti apa yang dilakukan Java 8 saat runtime ketika lamdba invokedynamic dipanggil pertama kali.
Anotasi Berulang hanyalah gula sintaksis. Mereka adalah bytecode yang kompatibel dengan versi sebelumnya. Di Java 7 Anda hanya perlu mengimplementasikan sendiri metode pembantu (mis. getAnnotationsByType) yang menyembunyikan detail implementasi anotasi container yang berisi anotasi berulang.
AFAIK, Jenis Anotasi hanya ada pada waktu kompilasi, sehingga tidak memerlukan perubahan bytecode, jadi hanya mengubah nomor versi bytecode dari kelas yang dikompilasi Java 8 sudah cukup untuk membuatnya berfungsi di Java 7.
Nama parameter metode ada dalam bytecode dengan Java 7, sehingga juga kompatibel. Anda dapat mengaksesnya dengan membaca bytecode metode dan melihat nama variabel lokal di informasi debug metode. Misalnya Spring Framework melakukan hal itu untuk mengimplementasikan @PathVariable, jadi mungkin ada metode perpustakaan yang bisa Anda panggil. Karena metode antarmuka abstrak tidak memiliki isi metode, informasi debug tersebut tidak ada untuk metode antarmuka di Java 7, dan AFAIK juga tidak ada di Java 8.
Fitur baru lainnya sebagian besar berupa API baru, peningkatan pada HotSpot, dan peralatan . Beberapa API baru tersedia sebagai perpustakaan pihak ketiga (misalnya ThreeTen-Backport dan dukungan streaming).
Singkatnya, metode default memerlukan fitur JVM baru tetapi fitur bahasa lainnya tidak. Jika Anda ingin menggunakannya, Anda harus mengkompilasi kode di Java 8 dan kemudian mengubah bytecode dengan Retrolambda ke Java 5 format /6/7. Minimal versi bytecode perlu diubah, dan javac melarang -source 1.8 -target 1.7
sehingga diperlukan retrotranslator.
person
Esko Luontola
schedule
20.05.2014