Yang saya coba lakukan hanyalah mendapatkan nama kelas saat ini, dan java menambahkan $ 1 yang tidak masuk akal ke akhir nama kelas saya. Bagaimana saya bisa menghilangkannya dan hanya mengembalikan nama kelas yang sebenarnya?
String className = this.getClass().getName();
String className = getClass().getName().substring(0, getClass().getName().indexOf("$"))
$1
, karena nama kelasnya$1
. Jika Anda mengharapkan sesuatu yang lain, gunakanthis
di kelas yang benar dan bukan yang salah.Jawaban:
"$ 1" bukan "tidak berguna tidak berguna". Jika kelas Anda anonim, nomor ditambahkan.
Jika Anda tidak ingin kelas itu sendiri, tetapi kelas deklarasinya, maka Anda dapat menggunakannya
getEnclosingClass()
. Sebagai contoh:Anda dapat memindahkannya dalam beberapa metode utilitas statis.
Tetapi perhatikan bahwa ini bukan nama kelas saat ini. Kelas anonim adalah kelas yang berbeda dari kelas yang dilampirkan. Kasingnya serupa untuk kelas dalam.
sumber
null
, dan menggunakan non-null
kelas terakhir yang Anda dapatkan?Mencoba,
Ini akan berfungsi selama Anda tidak menggunakannya dalam metode statis.
sumber
""
Coba gunakan ini
this.getClass().getCanonicalName()
atauthis.getClass().getSimpleName()
. Jika ini kelas anonim, gunakanthis.getClass().getSuperclass().getName()
sumber
Anda dapat menggunakan
this.getClass().getSimpleName()
, seperti:sumber
Kombinasi kedua jawaban. Juga mencetak nama metode:
sumber
jawaban ini terlambat, tetapi saya pikir ada cara lain untuk melakukan ini dalam konteks kelas handler anonim.
Katakanlah:
itu akan mencapai hasil yang sama. Selain itu, sebenarnya cukup nyaman karena setiap kelas didefinisikan pada waktu kompilasi, jadi tidak ada dinamika yang rusak.
di atas itu, jika kelas benar-benar bersarang, yaitu
A
sebenarnya tertutup olehB
, kelas B dapat dengan mudah dikenal sebagai:sumber
Dalam contoh Anda,
this
mungkin merujuk ke instance kelas anonim. Java memberi nama untuk kelas-kelas itu dengan menambahkan a$number
ke nama kelas terlampir.sumber
Saya berasumsi ini terjadi untuk kelas anonim. Saat Anda membuat kelas anonim, Anda benar-benar membuat kelas yang memperluas kelas yang namanya Anda dapatkan.
Cara "bersih" untuk mendapatkan nama yang Anda inginkan adalah:
Jika kelas Anda adalah kelas dalam anonim,
getSuperClass()
harus memberi Anda kelas dari mana ia diciptakan. Jika Anda membuatnya dari antarmuka daripada SOL, karena yang terbaik yang dapat Anda lakukan adalahgetInterfaces()
memberi Anda lebih dari satu antarmuka.Cara "hacky" adalah hanya dengan mendapatkan nama
getClassName()
dan menggunakan regex untuk menjatuhkan$1
.sumber
Berikut adalah varian Android, tetapi prinsip yang sama dapat digunakan di Jawa juga.
sumber
Saya menemukan ini berfungsi untuk kode saya ,, namun kode saya mendapatkan kelas dari array dalam for loop.
sumber
API Refleksi
sumber