Jawa - dapatkan saat ini nama kelas?

Semua saya coba lakukan adalah untuk mendapatkan saat ini nama kelas, dan jawa yang menambahkan tidak berguna non-sense $1 untuk akhir kelas saya nama. Bagaimana saya bisa menyingkirkan itu dan hanya kembali sebenarnya nama kelas?

String className = this.getClass().getName();
Mengomentari pertanyaan (3)
Larutan

"$1" tidak "berguna non-sense". Jika kelas anda adalah anonim, sejumlah ditambahkan.

Jika anda don't ingin kelas itu sendiri, tetapi menyatakan kelas, maka anda dapat menggunakan getEnclosingClass(). Misalnya:

Class<?> enclosingClass = getClass().getEnclosingClass();
if (enclosingClass != null) {
  System.out.println(enclosingClass.getName());
} else {
  System.out.println(getClass().getName());
}

Anda dapat memindahkan bahwa dalam beberapa statis utilitas metode.

Tetapi perhatikan bahwa ini bukan saat ini nama kelas. Anonymous class adalah kelas yang berbeda dari kelas yang melingkupi. Kasus ini mirip dalam kelas.

Komentar (1)

Cobalah,

String className = this.getClass().getSimpleName();

Ini akan bekerja selama anda don't menggunakan metode statis.

Komentar (3)

Mencoba menggunakan ini ini.getClass().getCanonicalName() atau ini.getClass().getSimpleName(). Jika itu's anonim kelas, menggunakan ini.getClass().getSuperclass().getName()

Komentar (7)

Anda dapat menggunakan ini.getClass().getSimpleName(), seperti:

import java.lang.reflect.Field;

public class Test {

    int x;
    int y;  

    public void getClassName() {
        String className = this.getClass().getSimpleName(); 
        System.out.println("Name:" + className);
    }

    public void getAttributes() {
        Field[] attributes = this.getClass().getDeclaredFields();   
        for(int i = 0; i < attributes.length; i++) {
            System.out.println("Declared Fields" + attributes[i]);    
        }
    }

    public static void main(String args[]) {

        Test t = new Test();
        t.getClassName();
        t.getAttributes();
    }
}
Komentar (0)

Kombinasi dari kedua jawaban. Juga cetakan nama metode:

Class thisClass = new Object(){}.getClass();
String className = thisClass.getEnclosingClass().getSimpleName();
String methodName = thisClass.getEnclosingMethod().getName();
Log.d("app", className + ":" + methodName);
Komentar (0)

jawaban ini terlambat, tapi saya pikir ada cara lain untuk melakukan hal ini dalam konteks anonim handler kelas.

let's mengatakan:

class A {
    void foo() {
        obj.addHandler(new Handler() {
            void bar() {
                String className=A.this.getClass().getName();
                // ...
            }
        });
    }
}

itu akan mencapai hasil yang sama. selain itu,'s benar-benar cukup berkualitas karena setiap kelas didefinisikan pada waktu kompilasi, sehingga tidak ada dynamicity rusak.

di atas itu, jika kelas adalah benar-benar bersarang, yaitu A benar-benar tertutup oleh B, kelas B dapat dengan mudah dikenal sebagai:

B.this.getClass().getName()
Komentar (0)

Dalam contoh anda, ini mungkin mengacu pada anonim kelas misalnya. Jawa memberi nama untuk kelas-kelas dengan menambahkan $nomor untuk nama melampirkan kelas.

Komentar (1)

I'm asumsi ini terjadi untuk anonim kelas. Ketika anda membuat sebuah anonim kelas anda benar-benar membuat kelas yang meluas kelas nama yang anda punya.

"cleaner" cara untuk mendapatkan nama yang anda inginkan adalah:

Jika kelas anda adalah anonymous inner class, getSuperClass() harus memberikan kelas yang diciptakan dari. Jika anda membuat itu dari sebuah antarmuka dari anda're semacam SOL karena yang terbaik yang dapat anda lakukan adalah getInterfaces() yang mungkin memberi anda lebih dari satu interface.

"hacky" adalah cara untuk mendapatkan nama dengan getClassName() dan menggunakan regex untuk menjatuhkan $1.

Komentar (0)

Refleksi Api

Ada beberapa Refleksi Api yang kembali ke kelas tapi ini mungkin hanya dapat diakses jika Kelas sudah diperoleh baik secara langsung atau secara tidak langsung.

Kelas.getSuperclass() Mengembalikan super kelas untuk kelas yang diberikan.

Kelas c = javax.ayunan.JButton.kelas.getSuperclass(); super kelas javax.ayunan.JButton adalah javax.ayunan.AbstractButton.

Kelas.getClasses()

Mengembalikan semua masyarakat kelas, interface, dan enums yang merupakan anggota kelas termasuk mewarisi anggota.

Kelas<?>[] c = Karakter.kelas.getClasses();

Karakter berisi dua anggota kelas Karakter.Subset dan Karakter.UnicodeBlock.

Kelas.getDeclaredClasses() Mengembalikan semua kelas-kelas interface, dan enums yang secara eksplisit dinyatakan di kelas ini.

Kelas<?>[] c = Karakter.kelas.getDeclaredClasses(); Karakter berisi dua anggota umum kelas Karakter.Subset dan Karakter.UnicodeBlock dan satu kelas privat Karakter.CharacterCache.

Kelas.getDeclaringClass() java.lang.mencerminkan.Bidang.getDeclaringClass() java.lang.mencerminkan.Metode.getDeclaringClass() java.lang.mencerminkan.Konstruktor.getDeclaringClass() Kembali Kelas di mana para anggota ini dinyatakan. Anonim Kelas Deklarasi tidak akan memiliki mendeklarasikan kelas tapi akan memiliki kelas yang melingkupi.

import java.lang.mencerminkan.Bidang;

Bidang f = Sistem.kelas.getField("out"); Kelas c = f.getDeclaringClass(); bidang dinyatakan dalam Sistem. public class MyClass { Objek statis o = new Object() { public void m() {} }; statis Kelas = o.getClass().getEnclosingClass(); }

menyatakan kelas anonim kelas yang didefinisikan oleh o adalah null.

Kelas.getEnclosingClass() Kembali segera melampirkan kelas dari kelas.

Kelas c = Thread.State.class().getEnclosingClass(); melampirkan kelas enum Benang.Negara adalah Benang.

public class MyClass { Objek statis o = new Object() { public void m() {} }; statis Kelas = o.getClass().getEnclosingClass(); } anonim kelas yang didefinisikan oleh o tertutup oleh MyClass.

Komentar (1)

I've ditemukan ini bekerja untuk kode saya,, namun saya kode ini akan mendapatkan kelas dari array hanya untuk loop.

String className="";

className = list[i].getClass().getCanonicalName();

System.out.print(className); //Use this to test it works
Komentar (1)