Mengambil Nama Kelas di Java

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan belajar tentang empat cara untuk mendapatkan nama kelas dari kaedah di API Kelas : getSimpleName (), getName (), getTypeName () dan getCanonicalName ().

Kaedah ini boleh membingungkan kerana nama mereka yang serupa dan Javadocs mereka yang agak kabur. Mereka juga mempunyai beberapa nuansa ketika datang ke jenis primitif, jenis objek, kelas dalam atau tanpa nama, dan tatasusunan.

2. Mengambil Nama Ringkas

Mari kita mulakan dengan kaedah getSimpleName () .

Di Jawa, ada dua jenis nama: sederhana dan berkualiti . Nama ringkas terdiri daripada pengecam unik sementara nama yang memenuhi syarat adalah urutan nama mudah yang dipisahkan oleh titik.

Seperti namanya, getSimpleName () mengembalikan nama ringkas kelas yang mendasari, itulah nama yang diberikan dalam kod sumber .

Mari bayangkan kelas berikut:

package com.baeldung.className; public class RetrieveClassName {}

Nama ringkasnya ialah RetrieveClassName :

assertEquals("RetrieveClassName", RetrieveClassName.class.getSimpleName());

Kita juga boleh mendapatkan jenis dan susunan primitif dengan nama mudah. Untuk jenis primitif yang hanya akan menjadi namanya, seperti int, boolean atau float .

Dan untuk tatasusunan, kaedah ini akan mengembalikan nama ringkas jenis larik diikuti dengan tanda kurung pembuka dan penutup pasangan untuk setiap dimensi susunan ([]) :

RetrieveClassName[] names = new RetrieveClassName[]; assertEquals("RetrieveClassName[]", names.getClass().getSimpleName());

Oleh itu, untuk array String dua dimensi , memanggil getSimpleName () pada kelasnya akan mengembalikan String [] [] .

Akhirnya, terdapat kes khusus kelas tanpa nama. Memanggil getSimpleName () pada kelas tanpa nama akan mengembalikan rentetan kosong.

3. Mengambil Nama Lain

Sekarang tiba masanya untuk melihat bagaimana kita memperoleh nama kelas, nama jenis, atau nama kanonik. Tidak seperti getSimpleName () , nama-nama ini bertujuan untuk memberi lebih banyak maklumat mengenai kelas.

Kaedah getCanonicalName () selalu mengembalikan nama kanonik seperti yang ditentukan dalam Spesifikasi Bahasa Java.

Bagi kaedah lain, keluarannya sedikit berbeza mengikut kes penggunaan. Kita akan melihat apa maksudnya untuk jenis objek primitif dan objek yang berbeza.

3.1. Jenis Primitif

Mari kita mulakan dengan jenis primitif, kerana ia mudah. Untuk jenis primitif, ketiga-tiga kaedah getName (), getTypeName () dan getCanonicalName () akan memberikan hasil yang sama dengan getSimpleName () :

assertEquals("int", int.class.getName()); assertEquals("int", int.class.getTypeName()); assertEquals("int", int.class.getCanonicalName());

3.2. Jenis Objek

Kita sekarang akan melihat bagaimana kaedah ini berfungsi dengan jenis objek. Tingkah laku mereka umumnya sama: mereka semua mengembalikan nama kanonik kelas .

Dalam kebanyakan kes, ini adalah nama yang berkelayakan yang mengandungi semua nama mudah pakej kelas dan juga nama ringkas kelas:

assertEquals("com.baeldung.className.RetrieveClassName", RetrieveClassName.class.getName()); assertEquals("com.baeldung.className.RetrieveClassName", RetrieveClassName.class.getTypeName()); assertEquals("com.baeldung.className.RetrieveClassName", RetrieveClassName.class.getSimpleName());

3.3. Kelas Dalam

Apa yang telah kita lihat di bahagian sebelumnya adalah tingkah laku umum kaedah panggilan ini, tetapi terdapat beberapa pengecualian.

Kelas dalaman adalah salah satu daripadanya. Kaedah getName () dan getTypeName () berkelakuan berbeza daripada kaedah getCanonicalName () untuk kelas dalaman.

getCanonicalName () masih mengembalikan nama kanonik kelas , iaitu nama kanonik kelas yang dilampirkan dan nama mudah kelas dalam yang dipisahkan oleh titik.

Sebaliknya, kaedah getName () dan getTypeName () kembali sama tetapi menggunakan dolar sebagai pemisah antara nama kanonik kelas yang dilampirkan dan nama mudah kelas dalam .

Mari bayangkan kelas dalaman InnerClass dari RetrieveClassName kami :

public class RetrieveClassName { public class InnerClass {} }

Kemudian setiap panggilan menunjukkan kelas dalaman dengan cara yang sedikit berbeza:

assertEquals("com.baeldung.RetrieveClassName.InnerClass", RetrieveClassName.InnerClass.class.getCanonicalName()); assertEquals("com.baeldung.RetrieveClassName$InnerClass", RetrieveClassName.InnerClass.class.getName()); assertEquals("com.baeldung.RetrieveClassName$InnerClass", RetrieveClassName.InnerClass.class.getTypeName());

3.4. Kelas Tanpa Nama

Kelas tanpa nama adalah pengecualian lain.

Seperti yang telah kita lihat, mereka tidak memiliki nama sederhana, tetapi mereka juga tidak mempunyai nama kanonik . Oleh itu, getCanonicalName () tidak mengembalikan apa-apa. Bertentangan dengan getSimpleName () , getCanonicalName () akan mengembalikan nol dan bukan rentetan kosong apabila dipanggil kelas tanpa nama.

Bagi getName () dan getTypeName () mereka akan mengembalikan nama kanonik kelas panggilan diikuti dengan dolar dan nombor yang mewakili kedudukan kelas tanpa nama di antara semua kelas tanpa nama yang dibuat di kelas panggilan .

Mari kita gambarkan ini dengan contoh. Kami akan membuat di sini dua kelas tanpa nama dan memanggil getName () pada yang pertama dan getTypeName () pada yang kedua, menyatakannya di com.baeldung. Utama :

assertEquals("com.baeldung.Main$1", new RetrieveClassName() {}.getClass().getName()); assertEquals("com.baeldung.Main$2", new RetrieveClassName() {}.getClass().getTypeName());

Kita harus perhatikan bahawa panggilan kedua mengembalikan nama dengan bilangan yang bertambah di hujungnya, seperti yang berlaku pada kelas tanpa nama kedua.

3.5. Susunan

Akhirnya, mari kita lihat bagaimana tatasusila ditangani dengan tiga kaedah di atas.

Untuk menunjukkan bahawa kita menghadapi tatasusunan, setiap kaedah akan mengemas kini hasil standardnya. Kaedah getTypeName () dan getCanonicalName () akan menambahkan pasangan kurungan ke hasilnya.

Mari kita lihat contoh berikut di mana kita memanggil getTypeName () dan getCanonicalName () pada tatasusunan InnerClass dua dimensi :

assertEquals("com.baeldung.RetrieveClassName$InnerClass[][]", RetrieveClassName.InnerClass[][].class.getTypeName()); assertEquals("com.baeldung.RetrieveClassName.InnerClass[][]", RetrieveClassName.InnerClass[][].class.getCanonicalName());

Perhatikan bagaimana panggilan pertama menggunakan dolar dan bukannya titik untuk memisahkan bahagian kelas dalam dari nama yang lain.

Sekarang mari kita lihat bagaimana kaedah getName () berfungsi. Apabila dipanggil pada array jenis primitif, ia akan mengembalikan tanda kurung pembuka dan huruf yang mewakili jenis primitif .Mari kita periksa dengan contoh berikut, memanggil kaedah itu pada array bilangan bulat primitif dua dimensi:

assertEquals("[[I", int[][].class.getName());

Sebaliknya, ketika dipanggil pada array objek, ia akan menambahkan tanda kurung pembuka dan huruf L pada hasilnya yang standar dan selesai dengan titik koma . Mari mencubanya pada pelbagai RetrieveClassName :

assertEquals("[Lcom.baeldung.className.RetrieveClassName;", RetrieveClassName[].class.getName());

4. Kesimpulan

Dalam artikel ini, kami melihat empat kaedah untuk mengakses nama kelas di Java. Kaedah ini adalah: getSimpleName (), getName (), getTypeName () dan getCanonicalName () .

Kami mengetahui bahawa yang pertama hanya mengembalikan nama kod sumber kelas sementara yang lain memberikan lebih banyak maklumat seperti nama pakej dan petunjuk sama ada kelas itu kelas dalam atau kelas tanpa nama.

Kod artikel ini boleh didapati di GitHub.