Di Jawa, apa pro / kontra seputar pilihan untuk menggunakan a.getClass()
atau A.class
? Keduanya dapat digunakan di mana pun yang Class<?>
diharapkan, tetapi saya membayangkan bahwa akan ada kinerja atau manfaat halus lainnya untuk menggunakan keduanya dalam keadaan yang berbeda (seperti halnya dengan Class.forName()
dan ClassLoader.loadClass()
.
sumber
A.class.getClass()
?Class
objek dari kelas yang mewakiliA.class
objek yang lagi-lagi merupakan turunan darijava.lang.Class
.A.getClass().class
?A
adalah kelas. Tidak adagetClass
metode statis di kelas.Mereka sebenarnya berbeda dalam hal tempat Anda dapat menggunakannya.
A.class
bekerja pada waktu kompilasi sementaraa.getClass()
membutuhkan sebuah instance dari tipeA
dan bekerja pada waktu proses.Mungkin ada perbedaan kinerja juga. Sementara
A.class
dapat diselesaikan oleh compiler karena mengetahui jenis sebenarnyaA
,a.getClass()
adalah panggilan metode virtual yang terjadi pada waktu proses.Sebagai referensi, bytecode penargetan compiler biasanya memancarkan instruksi berikut untuk
Integer.getClass()
:dan berikut ini untuk
Integer.class
:Yang pertama biasanya akan melibatkan pengiriman metode virtual dan oleh karena itu mungkin membutuhkan waktu lebih lama untuk dieksekusi. Itu pada akhirnya tergantung JVM.
sumber
lihat contoh di bawah ini
a.getClass()!= A.class
, Yaitu a bukanlah turunan dari A tetapi dari sub kelas anonim Aa.getClass()
membutuhkan instance tipe Asumber
Gunakan
a.getClass
jika Anda memiliki instance kelas / jenis dan Anda ingin mendapatkan jenis yang tepat. whilea.class
digunakan ketika Anda memilikitype
tersedia dan Anda ingin membuat instance darinya.Juga
getClass()
mengembalikan jenis runtime dari instance saat.class
dievaluasi pada waktu kompilasi.Mempertimbangkan kinerja
getClass()
dan.class
,.class
memiliki kinerja yang lebih baik darigetClass()
.Contoh:
Keluaran:
sumber
Ada satu perbedaan yang ingin saya tambahkan. Katakanlah Anda memiliki kelas konstruktor seperti yang ditunjukkan di bawah ini dengan kelas super yang mengambil objek Kelas. Anda ingin bahwa setiap kali objek subkelas dibuat, objek kelas subkelas harus diteruskan ke kelas super. Kode di bawah ini tidak akan dikompilasi karena Anda tidak dapat memanggil metode instance dalam konstruktor. Dalam hal ini jika Anda mengganti
myObject.getClass()
denganMyClass.class
. Ini akan berjalan dengan sempurna.sumber
Menariknya, perbedaan kinerja yang disebutkan dalam contoh di atas, tampaknya terkait dengan alasan lain. Menggunakan 3 Kelas yang berbeda, rata-rata kinerjanya akan hampir sama:
Outputnya akan seperti ini:
Dan mengubah urutan panggilan bahkan akan menghasilkan
getClass()
lebih cepat.Keluaran:
sumber
p.getClass()
, di manap
adalah turunan dari suatu objek, mengembalikan kelas waktu proses dari objek inip
.p
tidak bisa menjadi tipe yang akan menyebabkan kesalahan waktu kompilasi, itu harus merupakan turunan dari sebuah objek.p.class
adalah ekspresi. Ini.class
disebut sintaks kelas.p
adalah tipe. Ini bisa berupa nama kelas, antarmuka atau larik dan bahkan tipe primitif.a.getClass() == B.class
.Jika sebuah tipe tersedia dan ada sebuah instance maka dimungkinkan untuk menggunakan
getClass
metode untuk mendapatkan nama tipe tersebut. Jika tidak, gunakan.class
sintakssumber