Kemungkinan Duplikat: Bagaimana cara mengakses kelas-java di paket-default?
Saya menggunakan Eclipse 3.5 dan saya telah membuat proyek dengan beberapa struktur paket bersama dengan paket default. Saya memiliki satu kelas dalam paket default - Calculations.java dan saya ingin menggunakan kelas itu di salah satu paket (misalnya di com.company.calc
). Ketika saya mencoba untuk menggunakan kelas yang ada dalam paket default, itu memberi saya kesalahan kompiler. Itu tidak dapat mengenali kelas dalam paket default. Dimana masalahnya?
Calculations.java - kode sumber
public class Calculations {
native public int Calculate(int contextId);
native public double GetProgress(int contextId);
static {
System.loadLibrary("Calc");
}
}
Saya tidak dapat memasukkan kelas saya ke dalam paket lain. Kelas ini memiliki beberapa metode asli yang diimplementasikan di Delphi. Jika saya meletakkan kelas itu di salah satu folder, saya harus membuat perubahan pada DLL yang ingin saya hindari (sungguh - saya tidak bisa). Itulah mengapa saya menempatkan kelas saya dalam paket default.
sumber
Jawaban:
Dari spesifikasi bahasa Java :
Anda harus mengakses kelas melalui refleksi atau metode tidak langsung lainnya.
sumber
Kelas dalam paket default tidak dapat diimpor oleh kelas dalam paket. Inilah mengapa Anda sebaiknya tidak menggunakan paket default.
sumber
Ada solusi untuk masalah Anda. Anda dapat menggunakan refleksi untuk mencapainya.
Pertama, buat antarmuka untuk kelas target Anda
Calculatons
:Selanjutnya, buat kelas target Anda mengimplementasikan antarmuka itu :
Terakhir, gunakan refleksi untuk membuat instance
Calculations
kelas dan menugaskannya ke variabel tipeCalculationsInterface
:sumber
Saya dapat memberikan saran ini, Sejauh yang saya tahu dari pengalaman Pemrograman C dan C ++ saya, Suatu ketika, ketika saya memiliki masalah yang sama, saya menyelesaikannya dengan mengubah struktur tertulis dll di ".C" File dengan mengubah nama fungsi yang mengimplementasikan fungsionalitas asli JNI. misalnya, Jika Anda ingin menambahkan program Anda ke dalam paket "com.mypackage", Anda mengubah prototipe JNI yang mengimplementasikan fungsi / metode File ".C" menjadi yang ini:
Karena saya baru mengenal delphi, saya tidak dapat menjamin Anda tetapi akan mengatakan ini akhirnya, (Saya belajar beberapa hal setelah googling tentang Delphi dan JNI): Tanyakan orang-orang itu (Jika Anda bukan orangnya) yang menyediakan implementasi Delphi dari native kode untuk mengubah nama fungsi menjadi seperti ini:
Tapi, saran terakhir: Meskipun Anda (Jika Anda adalah programmer delphi) atau mereka akan mengubah prototipe dari fungsi-fungsi ini dan mengkompilasi ulang file dll, setelah file dll dikompilasi, Anda tidak akan dapat mengubah nama paket Anda. File "Java" lagi & lagi. Karena, ini sekali lagi akan meminta Anda atau mereka untuk mengubah prototipe dari fungsi di delphi dengan prefiks yang diubah (mis. JAVA_yourpackage_with_underscores_for_inner_packages_JavaFileName_MethodName)
Saya pikir ini menyelesaikan masalah. Terima kasih dan salam, Harshal Malshe
sumber
Dari beberapa tempat saya temukan di bawah ini: -
Nyatanya, Anda bisa.
Dengan menggunakan API refleksi, Anda sejauh ini dapat mengakses kelas apa pun. Setidaknya saya bisa :)
sumber
Sayangnya, Anda tidak dapat mengimpor kelas tanpa berada di dalam paket. Inilah salah satu alasan mengapa sangat tidak disarankan. Apa yang akan saya coba adalah semacam proxy - masukkan kode Anda ke dalam paket yang dapat digunakan apa saja, tetapi jika Anda benar-benar membutuhkan sesuatu dalam paket default, buatlah itu menjadi kelas yang sangat sederhana yang meneruskan panggilan ke kelas dengan kode yang sebenarnya. Atau, yang lebih sederhana, perpanjang saja.
Sebagai contoh:
sumber
Buat paket baru Dan kemudian pindahkan kelas paket default dalam paket baru dan gunakan kelas tersebut
sumber
sumber
Buat paket "root" (folder) di proyek Anda, misalnya.
sumber paket; (... / path_to_project / source /)
Pindahkan YourClass.class ke dalam folder sumber. (... / path_to_project / source / YourClass.class)
Impor seperti ini
import source.YourClass;
sumber