Soru Java - geçerli sınıf adını al?


Tüm yapmaya çalıştığım mevcut sınıf adını almak ve java işe yaramaz bir anlamsız $ 1 sınıfımın sonuna kadar. Bundan nasıl kurtulabilirim ve sadece gerçek sınıf adını döndürürüm?

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

223
2018-06-07 20:46


Menşei


Bunu nerden arıyorsun? Anonim bir iç sınıftan mı? Sınıfın tanımı ve bu satırın nerelere çağrıldığı ile ilgili ayrıntıları gösteren daha fazla kod ekleyebilir misiniz? - plainjimbo
Yani, tek istediğin String className = getClass().getName().substring(0, getClass().getName().indexOf("$")) - josh.trow
Eğer alırsanız $1 o zaman, çünkü sınıfın adı $1. Başka bir şey bekliyorsan, kullan this yanlış sınıf yerine doğru sınıfta. - ceving


Cevaplar:


"1 $", "faydasız anlamsız" değildir. Sınıfınız anonim ise, bir sayı eklenir.

Eğer sınıfın kendisini, ancak onun beyan eden sınıfını istemiyorsanız, o zaman kullanabilirsiniz getEnclosingClass(). Örneğin:

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

Bunu bazı statik yardımcı programlarda taşıyabilirsiniz.

Ancak bunun geçerli sınıf adı olmadığını unutmayın. Anonim sınıf, kendi sınıfından farklı bir sınıftır. Dava iç sınıflar için benzerdir.


211
2018-06-07 20:49



Ama eğer kapsayıcı sınıf aynı zamanda anonim bir iç sınıfsa? Dönene kadar yinelemeli sınıfı elde etmenize gerek yok mu? nullve son olmayanı kullannull sınıfın var mı? - Garret Wilson


Deneyin,

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

Bu, statik bir yöntemde kullanmadığınız sürece çalışır.


176
2018-06-12 20:41



Aslında, bu işe yaramaz. Bu soru anonim bir iç sınıfı olduğunu ve bu durumda getSimpleName () döndürdüğünü gösterir. "" - vikingsteve
Bu, soruyu yanıtlamıyor olsa da, bu SO gönderisi, google'da "sınıf adı java'yı al" için en iyi sonuçlardadır ve bu nedenle topluluğa hala yardımcı olmaktadır. - EdgeCaseBerg
Paket ad alanı olmadan isim dönecektir. İyi bir! - Oleg Abrazhaev


Bunu kullanmayı dene this.getClass().getCanonicalName() veya this.getClass().getSimpleName(). Anonim bir sınıfsa, kullanın this.getClass().getSuperclass().getName() 


19
2018-06-07 20:53



çalışmıyor ... - Bozho
Aslında öyle. Bağlı. Eğer anonim bir sınıfla uygulamakta olduğunuz soyut sınıfın ismini almaya çalışıyorsanız, bu sizin kullandığınız şeydir. - MirroredFate
onun vakası için (anonim sınıf), basit isim boş, kanonik adı boş ve üst sınıf Object'dir. - Bozho
Evet, hayır. İlk iki tahmin ettim, üçüncü, ancak, doğru. Anonim bir sınıf, uyguladığı sınıfın bir alt sınıfıdır. Bu yüzden çalışıyorlar. Böylece, üst sınıf soyut sınıftır. - MirroredFate
Ve ... yorumunu sildi ... - MirroredFate


Kullanabilirsiniz this.getClass().getSimpleName(), böyle:

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();
    }
}

8
2017-09-25 22:22





Bu cevap geç kaldı, ancak anonim işleyici sınıfı bağlamında bunu yapmanın başka bir yolu olduğunu düşünüyorum.

diyelimki:

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

aynı sonucu elde edecek. ek olarak, her sınıf derleme zamanında tanımlandığından, aslında oldukça kolaylık sağlar, bu nedenle hiçbir dinamiklik zarar görmez.

Bunun üzerinde, eğer sınıf gerçekten yuvalanmışsa, yani A aslında tarafından kapalı BB sınıfı kolayca şöyle bilinebilir:

B.this.getClass().getName()

3
2018-02-23 21:40





Her iki cevabın kombinasyonu. Ayrıca bir yöntem adı yazdırır:

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

3
2018-03-29 22:14





Örneğinde, this muhtemelen anonim bir sınıf örneğine başvurur. Java, bu sınıflara bir $number kapalı sınıfın adına.


2
2018-06-07 20:51



Anonim olmayan iç sınıflar, Dış $ Inner olarak adlandırılır. Bu anonim bir sınıf olacak. - Duncan McGregor


Anonim bir sınıf için bunun gerçekleştiğini farz ediyorum. Anonim bir sınıf oluşturduğunuzda, gerçekte ismi olan sınıfı genişleten bir sınıf yaratırsınız.

İstediğiniz adı almak için "temiz" yolu:

Sınıfınız anonim bir iç sınıfsa, getSuperClass() size oluşturulduğu sınıfı vermelisiniz. Bir arabirimden SOL türünden daha fazlasını oluşturduysanız, yapabileceğiniz en iyi şey getInterfaces() Birden fazla arayüze sahip olabilirsiniz.

"Hakikat" yolu sadece getClassName() ve bırakmak için bir regex kullanın $1.


1
2018-06-07 21:06





Bunu kodum için çalışmamı buldum, ancak kodum sınıfı bir for döngüsündeki bir diziden alıyor.

String className="";

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

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

-3
2018-05-01 02:04



Bu, diğer cevapların henüz söylemediği bir şey eklemiyor. Tüm döngü / dizi sorunu ilgisizdir. Ayrıca, kod biçimlendirmesinin sorular / cevaplar üzerinde nasıl çalıştığına da bakmalısınız. - Jonathon Reinhart