Anda tidak dapat menggunakan kelas dalam paket default dari paket bernama.
( Secara teknis Anda bisa, seperti yang ditunjukkan dalam jawaban Sharique Abdullah melalui API refleksi, tetapi kelas dari namespace yang tidak disebutkan namanya tidak dalam cakupan dalam deklarasi impor )
Sebelum J2SE 1.4 Anda dapat mengimpor kelas dari paket default menggunakan sintaks seperti ini:
import Unfinished;
Itu tidak lagi diizinkan . Jadi untuk mengakses kelas paket default dari dalam kelas yang dikemas memerlukan pemindahan kelas paket default ke dalam paketnya sendiri.
Jika Anda memiliki akses ke sumber yang dihasilkan oleh groovy, beberapa pemrosesan pasca diperlukan untuk memindahkan file ke dalam paket khusus dan menambahkan perintah "paket" ini di awal.
Pembaruan 2014: bug 6975015 , untuk JDK7 dan JDK8, jelaskan larangan yang lebih ketat terhadap impor dari paket yang tidak disebutkan namanya.
The TypeName
harus nama kanonik jenis kelas, jenis antarmuka, jenis enum, atau jenis anotasi.
Tipe harus salah satu anggota dari paket bernama , atau anggota tipe yang terluar tipe melampirkan secara leksikal adalah anggota dari paket bernama , atau kesalahan waktu kompilasi terjadi .
Andreas menunjukkan dalam komentarnya :
"mengapa [paket default] ada di tempat pertama? kesalahan desain?"
Tidak, itu disengaja.
JLS 7.4.2. Paket Tanpa Nama menyatakan: "Paket tanpa nama disediakan oleh platform Java SE terutama untuk kenyamanan saat mengembangkan aplikasi kecil atau sementara atau saat baru memulai pengembangan".
Nyatanya, Anda bisa.
Dengan menggunakan API refleksi, Anda sejauh ini dapat mengakses kelas apa pun. Setidaknya saya bisa :)
sumber
val bar = "hi"; val fooClass = Class.forName("FooClass"); val fooMethod = fooClass.getMethod("foo", classOf[Array[String]]); val fooReturned = fooMethod.invoke(fooClass.newInstance(), Array(bar));
Class.forName("FooBar").newInstance().fooMethod("I did it")
Gunakan jarjar untuk mengemas ulang file jar dengan aturan berikut:
Semua kelas dalam paket default file jar sumber akan dipindahkan ke paket target, sehingga dapat mengakses.
sumber
Anda dapat menggunakan paket di
Groovy
kode, dan semuanya akan berfungsi dengan baik.Ini mungkin berarti reorganisasi kecil kode di bawah
grails-app
dan sedikit sakit pada awalnya, tetapi pada proyek grails besar, masuk akal untuk mengatur hal-hal dalam paket. Kami menggunakan konvensi penamaan paket standar Javacom.foo.<app>.<package>
.Memiliki semua yang ada di paket default menjadi penghalang integrasi, seperti yang Anda temukan.
Pengontrol tampaknya adalah artefak Grails (atau artefak) yang menolak dimasukkan ke dalam paket Java. Mungkin saya belum menemukan
Convention
jawabannya. ;-)sumber
hanya untuk menyelesaikan idenya:
Dari dalam paket default Anda dapat mengakses objek yang berada dalam paket bernama.
sumber