Apa artinya .class di Jawa?

149

Apa .classartinya di Jawa? Misalnya, jika saya membuat kelas bernama Print. Apa yang Print.classkembali?

Quinn Wei
sumber
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.

Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());
Javier
sumber
2
Apa beberapa hal yang dapat dilakukan seseorang dengan objek kelas?
Kevin
7
@Kevin Lihat dokumentasi API untuk java.lang.Class .
Patricia Shanahan
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.

Sebagai contoh:

String string = "hello";
System.out.println(string.getClass().toString());

Ini akan menampilkan:

class java.lang.String

Ini adalah kelas dari objek string :)

christopher
sumber
7
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 error

Class c = boolean.class;  // correct

Lihat: docs.oracle.com tentang kelas

Andrew
sumber
6

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.

Salvador Valencia
sumber
3

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;

    public class Test {
       public static void main(String[] args)
       {
          //there is no instance available for class Test, so use Test.class
          System.out.println("Test.class.getName() ::: " + Test.class.getName());

          // Now create an instance of class Test use getClass()
          Test testObj = new Test();
          System.out.println("testObj.getClass().getName() ::: " + testObj.getClass().getName());

          //For primitive type
          System.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());
       }
    }
Ranjeet
sumber
1

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.

Xerxes
sumber
4
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<Print> p = Print.class;

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

PbxMan
sumber