Mengambil Nama Kelas di Java

1. Ikhtisar

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

Metode ini dapat membingungkan karena namanya yang mirip dan Javadocs yang agak kabur. Mereka juga memiliki beberapa perbedaan dalam hal tipe primitif, tipe objek, kelas dalam atau anonim, dan array.

2. Mengambil Nama Sederhana

Mari kita mulai dengan metode getSimpleName () .

Di Jawa ada dua macam nama: sederhana dan berkualitas . Nama sederhana terdiri dari pengenal unik sedangkan nama yang memenuhi syarat adalah urutan nama sederhana yang dipisahkan oleh titik.

Seperti namanya, getSimpleName () mengembalikan nama sederhana dari kelas yang mendasarinya, yaitu nama yang telah diberikan dalam kode sumber .

Bayangkan kelas berikut:

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

Nama sederhananya adalah RetrieveClassName :

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

Kita juga bisa mendapatkan tipe primitif dan array nama sederhana. Untuk tipe primitif yang hanya namanya saja, seperti int, boolean atau float .

Dan untuk array, metode akan mengembalikan nama sederhana dari tipe array diikuti dengan sepasang tanda kurung buka dan tutup untuk setiap dimensi dari array ([]) :

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

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

Terakhir, ada kasus khusus kelas anonim. Memanggil getSimpleName () pada kelas anonim akan mengembalikan string kosong.

3. Mengambil Nama Lain

Sekarang saatnya untuk melihat bagaimana kita akan mendapatkan nama kelas, nama jenis, atau nama kanonik. Tidak seperti getSimpleName () , nama ini bertujuan untuk memberikan lebih banyak informasi tentang kelas.

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

Sedangkan untuk metode lainnya, hasilnya dapat sedikit berbeda sesuai dengan kasus penggunaan. Kita akan melihat apa artinya untuk tipe primitif dan objek yang berbeda.

3.1. Jenis Primitif

Mari kita mulai dengan tipe primitif, karena mereka sederhana. Untuk tipe primitif, ketiga metode getName (), getTypeName () dan getCanonicalName () akan mengembalikan hasil yang sama seperti getSimpleName () :

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

3.2. Jenis Objek

Sekarang kita akan melihat bagaimana metode ini bekerja dengan tipe objek. Perilaku mereka umumnya sama: mereka semua mengembalikan nama kanonik kelas .

Dalam kebanyakan kasus, ini adalah nama yang memenuhi syarat yang berisi semua paket kelas nama sederhana serta nama sederhana 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 Batin

Apa yang telah kita lihat di bagian sebelumnya adalah perilaku umum dari pemanggilan metode ini, tetapi ada beberapa pengecualian.

Kelas batin adalah salah satunya. Metode getName () dan getTypeName () berperilaku berbeda dari metode getCanonicalName () untuk kelas dalam.

getCanonicalName () masih mengembalikan nama kanonik kelas , yaitu nama kanonik kelas yang melingkupi ditambah nama sederhana kelas dalam yang dipisahkan oleh titik.

Di sisi lain, metode getName () dan getTypeName () mengembalikan hampir sama tetapi menggunakan dolar sebagai pemisah antara nama kanonik kelas yang melingkupi dan nama sederhana kelas dalam .

Mari kita bayangkan kelas dalam InnerClass dari RetrieveClassName kita :

public class RetrieveClassName { public class InnerClass {} }

Kemudian setiap panggilan menunjukkan kelas dalam dengan cara yang sedikit berbeda:

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 Anonim

Kelas anonim adalah pengecualian lainnya.

Seperti yang telah kita lihat, mereka tidak memiliki nama sederhana, tetapi juga tidak memiliki nama kanonik . Oleh karena itu, getCanonicalName () tidak mengembalikan apa pun. Berlawanan dengan getSimpleName () , getCanonicalName () akan mengembalikan null dan bukan string kosong saat dipanggil di kelas anonim.

Adapun getName () dan getTypeName () mereka akan mengembalikan nama kanonik kelas pemanggil diikuti dengan dolar dan angka yang mewakili posisi kelas anonim di antara semua kelas anonim yang dibuat di kelas pemanggil .

Mari kita ilustrasikan ini dengan sebuah contoh. Di sini kita akan membuat dua kelas anonim dan memanggil getName () di kelas pertama dan getTypeName () di kelas kedua, mendeklarasikannya di com.baeldung.Main :

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

Kita harus mencatat bahwa panggilan kedua mengembalikan nama dengan nomor yang bertambah di ujungnya, seperti yang diterapkan pada kelas anonim kedua.

3.5. Array

Terakhir, mari kita lihat bagaimana array ditangani oleh tiga metode di atas.

Untuk menunjukkan kita berurusan dengan array, setiap metode akan memperbarui hasil standarnya. Metode getTypeName () dan getCanonicalName () akan menambahkan pasangan tanda kurung ke hasilnya.

Let's see the following example where we call getTypeName() and getCanonicalName() on a bidimensional InnerClass array:

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

Note how the first call uses a dollar instead of a dot to separate the inner class part from the rest of the name.

Let's now see how the getName() method works. When called on a primitive type array, it will return an opening bracket and a letter representing the primitive type.Let's check that with the following example, calling that method on a bidimensional primitive integers array:

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

Di sisi lain, ketika dipanggil pada larik objek, ia akan menambahkan kurung buka dan huruf L ke hasil standarnya dan diakhiri dengan titik koma . Mari kita coba pada array RetrieveClassName :

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

4. Kesimpulan

Pada artikel ini, kami melihat empat metode untuk mengakses nama kelas di Java. Metode ini adalah: getSimpleName (), getName (), getTypeName () dan getCanonicalName () .

Kami belajar bahwa yang pertama hanya mengembalikan nama kode sumber kelas sementara yang lain memberikan lebih banyak informasi seperti nama paket dan indikasi apakah kelas itu dalam atau kelas anonim.

Kode artikel ini dapat ditemukan di GitHub.