Saya khawatir saya tidak sepenuhnya mengerti apa yang Anda minta. Jika Anda bisa menguraikan sedikit lebih banyak, seseorang mungkin dapat memberikan Anda informasi yang lebih berguna
Paul Walker
28
Ini jelas terlihat seperti pertanyaan nyata bagi saya. Saya sendiri hanya menanyakan pertanyaan ini, dan menemukan diri saya di sini setelah pencarian Google cepat. Kurasa aku seharusnya tidak repot kalau aku tahu pertanyaanku tidak nyata!
Dokter Jones
1
Juga, saya pikir karena kecanggungan dari string pencarian tertentu, ada sedikit tulisan atau dapat ditemukan tentang pertanyaan ini. Selain dokumen API yang ditautkan ke atas, saya belum pernah melihat notasi ini disebutkan di tempat lain (walaupun Anda sering melihatnya digunakan dalam refleksi).
jordanpg
2
@ MadProgrammer, OP bertanya tentang .classsintaks yang hanya terkait dengan .classekstensi nama file.
jordanpg
Jawaban:
143
Ketika Anda menulis .classsetelah nama kelas, itu referensi kelas literal -
java.lang.Classobjek yang mewakili informasi tentang kelas yang diberikan.
Misalnya, jika kelas Anda Print, maka Print.classadalah objek yang mewakili kelas Printsaat runtime. Ini adalah objek yang sama yang dikembalikan oleh getClass()metode setiap instance (langsung) dari Print.
Aplikasi: mengakses bidang swasta, misalnya: Writer.class.getDeclaredField("writeBuffer").
jordanpg
2
Jadi apa jenisnya Print.class?
Zhipeng YANG
1
Dan bagaimana cara Android menangani new Intent(this, Activity.class? Apakah akan mencoba mencari tahu class Activitydengan membandingkan setiap kelas?
Zhipeng YANG
56
.class digunakan ketika tidak ada instance kelas yang tersedia.
.getClass() digunakan ketika ada instance kelas yang tersedia.
object.getClass() mengembalikan kelas dari objek yang diberikan.
getClass()hanya berguna jika Anda memiliki referensi yang menunjuk ke objek kelas. ClassName.classdapat digunakan bahkan jika kelas tidak memiliki instance. Sebagai contoh, pertimbangkan Math.class. Masing-masing tepat untuk situasi tertentu.
Patricia Shanahan
Penjelasan yang brilian. Tepat ke titik itu. Cinta bagaimana Anda mengidentifikasi perbedaan antara .classdan.getClass().
Sevastyan Savanyuk
6
Jika instance objek tersedia, maka cara paling sederhana untuk mendapatkan Kelasnya adalah dengan memanggil Object.getClass()
The .classSintaks
Jika tipe tersedia tetapi tidak ada instance maka dimungkinkan untuk mendapatkan Kelas dengan menambahkan .classnama tipe tersebut. Ini juga cara termudah untuk mendapatkan Kelas untuk tipe primitif.
boolean b;Class c = b.getClass();// compile-time errorClass c =boolean.class;// correct
Hanya untuk memperjelas, metode '.class' ini tidak mengacu pada file bytecode yang Anda lihat setelah kompilasi kode java atau kebingungan antara konsep Class vs. Object dalam teori OOP.
Metode '.class' ini digunakan di Java untuk refleksi kode. Secara umum Anda dapat mengumpulkan data meta untuk kelas Anda seperti nama kelas yang memenuhi syarat, daftar konstanta, daftar bidang publik, dll, dll.
Biasanya Anda tidak berencana menggunakan Refleksi segera ketika Anda mulai membangun proyek Anda. Ini adalah sesuatu yang Anda tahu Anda butuhkan setelah mencoba mengelola kode yang sudah berfungsi. Sering kali Anda membutuhkannya untuk mengelola beberapa instance program Anda. Mungkin Anda ingin mengidentifikasi setiap 'klon' tertentu untuk menentukan apakah ada sesuatu yang sudah ditentukan, atau menghitung jumlah fungsi, atau hanya cukup mencatat rincian dari instance tertentu dari kelas Anda.
Jika tidak ada instance yang tersedia maka .classsintaks digunakan untuk mendapatkan objek Class yang sesuai untuk sebuah kelas, jika tidak, Anda dapat menggunakan metode getClass () untuk mendapatkan objek Class. Karena, tidak ada contoh tipe data primitif, kita harus menggunakan .classsintaks untuk tipe data primitif.
package test;publicclassTest{publicstaticvoid main(String[] args){//there is no instance available for class Test, so use Test.classSystem.out.println("Test.class.getName() ::: "+Test.class.getName());// Now create an instance of class Test use getClass()Test testObj =newTest();System.out.println("testObj.getClass().getName() ::: "+ testObj.getClass().getName());//For primitive typeSystem.out.println("boolean.class.getName() ::: "+boolean.class.getName());System.out.println("int.class.getName() ::: "+int.class.getName());System.out.println("char.class.getName() ::: "+char.class.getName());System.out.println("long.class.getName() ::: "+long.class.getName());}}
Saya pikir kuncinya di sini adalah memahami perbedaan antara Kelas dan Obyek. Obyek adalah turunan dari Kelas. Tetapi dalam bahasa yang sepenuhnya berorientasi objek, Kelas juga merupakan Obyek . Jadi panggilan .classmendapat referensi ke objek Kelas dari Kelas itu, yang kemudian dapat dimanipulasi.
in a fully object-oriented language, a Class is also an Object? <rujukan?>
Sam Dufel
0
Literal kelas adalah ekspresi yang terdiri dari nama kelas, antarmuka, array, atau tipe primitif, atau kekosongan tipe pseudo, diikuti oleh '.' dan kelas token. Salah satu perubahan di JDK 5.0 adalah bahwa kelas java.lang.Class adalah generik java.lang.Class Class<T>, oleh karena itu:
.class
sintaks yang hanya terkait dengan.class
ekstensi nama file.Jawaban:
Ketika Anda menulis
.class
setelah nama kelas, itu referensi kelas literal -java.lang.Class
objek yang mewakili informasi tentang kelas yang diberikan.Misalnya, jika kelas Anda
Print
, makaPrint.class
adalah objek yang mewakili kelasPrint
saat runtime. Ini adalah objek yang sama yang dikembalikan olehgetClass()
metode setiap instance (langsung) dariPrint
.sumber
Writer.class.getDeclaredField("writeBuffer")
.Print.class
?new Intent(this, Activity.class
? Apakah akan mencoba mencari tahuclass Activity
dengan membandingkan setiap kelas?.class
digunakan ketika tidak ada instance kelas yang tersedia..getClass()
digunakan ketika ada instance kelas yang tersedia.object.getClass()
mengembalikan kelas dari objek yang diberikan.Sebagai contoh:
Ini akan menampilkan:
Ini adalah kelas dari objek string :)
sumber
getClass()
hanya berguna jika Anda memiliki referensi yang menunjuk ke objek kelas.ClassName.class
dapat digunakan bahkan jika kelas tidak memiliki instance. Sebagai contoh, pertimbangkanMath.class
. Masing-masing tepat untuk situasi tertentu..class
dan.getClass().
Jika instance objek tersedia, maka cara paling sederhana untuk mendapatkan Kelasnya adalah dengan memanggil
Object.getClass()
The
.class
SintaksJika tipe tersedia tetapi tidak ada instance maka dimungkinkan untuk mendapatkan Kelas dengan menambahkan
.class
nama tipe tersebut. Ini juga cara termudah untuk mendapatkan Kelas untuk tipe primitif.Lihat: docs.oracle.com tentang kelas
sumber
Hanya untuk memperjelas, metode '.class' ini tidak mengacu pada file bytecode yang Anda lihat setelah kompilasi kode java atau kebingungan antara konsep Class vs. Object dalam teori OOP.
Metode '.class' ini digunakan di Java untuk refleksi kode. Secara umum Anda dapat mengumpulkan data meta untuk kelas Anda seperti nama kelas yang memenuhi syarat, daftar konstanta, daftar bidang publik, dll, dll.
Periksa tautan ini (telah disebutkan di atas) untuk mendapatkan semua detail:
https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
https://docs.oracle.com/javase/8/docs /api/java/lang/Class.html
Biasanya Anda tidak berencana menggunakan Refleksi segera ketika Anda mulai membangun proyek Anda. Ini adalah sesuatu yang Anda tahu Anda butuhkan setelah mencoba mengelola kode yang sudah berfungsi. Sering kali Anda membutuhkannya untuk mengelola beberapa instance program Anda. Mungkin Anda ingin mengidentifikasi setiap 'klon' tertentu untuk menentukan apakah ada sesuatu yang sudah ditentukan, atau menghitung jumlah fungsi, atau hanya cukup mencatat rincian dari instance tertentu dari kelas Anda.
sumber
Jika tidak ada instance yang tersedia maka
.class
sintaks digunakan untuk mendapatkan objek Class yang sesuai untuk sebuah kelas, jika tidak, Anda dapat menggunakan metode getClass () untuk mendapatkan objek Class. Karena, tidak ada contoh tipe data primitif, kita harus menggunakan.class
sintaks untuk tipe data primitif.sumber
Saya pikir kuncinya di sini adalah memahami perbedaan antara Kelas dan Obyek. Obyek adalah turunan dari Kelas. Tetapi dalam bahasa yang sepenuhnya berorientasi objek, Kelas juga merupakan Obyek . Jadi panggilan
.class
mendapat referensi ke objek Kelas dari Kelas itu, yang kemudian dapat dimanipulasi.sumber
in a fully object-oriented language, a Class is also an Object
? <rujukan?>Literal kelas adalah ekspresi yang terdiri dari nama kelas, antarmuka, array, atau tipe primitif, atau kekosongan tipe pseudo, diikuti oleh '.' dan kelas token. Salah satu perubahan di JDK 5.0 adalah bahwa kelas java.lang.Class adalah generik
java.lang.Class Class<T>
, oleh karena itu:Referensi di sini:
https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html
http://docs.oracle.com/javase/tutorial/extra/generics/literals.html
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.2
sumber