it-swarm.com.de

Java - den aktuellen Klassennamen erhalten?

Ich versuche nur, den aktuellen Klassennamen abzurufen, und Java fügt an das Ende meines Klassennamens einen unnützen Unsinn $ 1 an. Wie kann ich es loswerden und nur den tatsächlichen Klassennamen zurückgeben?

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

Das "$ 1" ist nicht "nutzlos unsinnig". Wenn Ihre Klasse anonym ist, wird eine Nummer angehängt.

Wenn Sie nicht die Klasse selbst wollen, sondern ihre deklarierende Klasse, können Sie getEnclosingClass() verwenden. Zum Beispiel:

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

Sie können dies mit einer statischen Dienstprogrammmethode verschieben.

Beachten Sie jedoch, dass dies nicht der aktuelle Klassenname ist. Die anonyme Klasse ist eine andere Klasse als die umgebende Klasse. Ähnlich verhält es sich mit inneren Klassen.

231
Bozho

Versuchen,

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

Dies funktioniert, solange Sie es nicht in einer statischen Methode verwenden.

197
jesg

Versuchen Sie es mit this.getClass().getCanonicalName() oder this.getClass().getSimpleName(). Wenn es sich um eine anonyme Klasse handelt, verwenden Sie this.getClass().getSuperclass().getName()

29
MirroredFate

Sie können this.getClass().getSimpleName() folgendermaßen verwenden:

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

Die Kombination beider Antworten. Gibt auch einen Methodennamen aus:

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

diese Antwort ist spät, aber ich denke, es gibt eine andere Möglichkeit, dies im Kontext einer anonymen Handler-Klasse zu tun.

sagen wir:

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

es wird das gleiche Ergebnis erzielen. Darüber hinaus ist dies sehr praktisch, da jede Klasse zur Kompilierungszeit definiert wird, sodass die Dynamik nicht beeinträchtigt wird.

darüber hinaus kann, wenn die Klasse wirklich verschachtelt ist, d. h. A tatsächlich von B eingeschlossen ist, die Klasse von B leicht bekannt sein als:

B.this.getClass().getName()
3
Jason Hu

In Ihrem Beispiel bezieht sich this wahrscheinlich auf eine anonyme Klasseninstanz. Java gibt diesen Klassen einen Namen, indem ein $number an den Namen der umgebenden Klasse angehängt wird.

2
tonio

Ich gehe davon aus, dass dies für eine anonyme Klasse geschieht. Wenn Sie eine anonyme Klasse erstellen, erstellen Sie tatsächlich eine Klasse, die die Klasse erweitert, deren Namen Sie erhalten haben.

Der "sauberere" Weg, um den gewünschten Namen zu erhalten, ist:

Wenn Ihre Klasse eine anonyme innere Klasse ist, sollte getSuperClass() Ihnen die Klasse geben, aus der sie erstellt wurde. Wenn Sie es von einer Schnittstelle erstellt haben, sind Sie eine Art SOL, weil das Beste, was Sie tun können, getInterfaces() ist, das Ihnen möglicherweise mehr als eine Schnittstelle bietet.

Der "hackige" Weg ist, einfach den Namen mit getClassName() abzurufen und den $1 mit einer Regex abzulegen.

1
trutheality