web-dev-qa-db-fra.com

Java - récupère le nom de la classe en cours?

Tout ce que j'essaie de faire est d'obtenir le nom actuel de la classe et Java ajoute un non-sens inutile $ 1 à la fin du nom de ma classe. Comment puis-je m'en débarrasser et ne renvoyer que le nom de classe actuel?

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

Le "$ 1" n'est pas un "non-sens inutile". Si votre classe est anonyme, un numéro est ajouté.

Si vous ne voulez pas la classe elle-même, mais sa classe déclarante, vous pouvez utiliser getEnclosingClass(). Par exemple:

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

Vous pouvez déplacer cela dans une méthode d'utilitaire statique.

Mais notez que ce n'est pas le nom actuel de la classe. La classe anonyme est différente de la classe englobante. Le cas est similaire pour les classes internes.

231
Bozho

Essayer,

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

Cela fonctionnera tant que vous ne l'utilisez pas dans une méthode statique.

197
jesg

Essayez d’utiliser this.getClass().getCanonicalName() ou this.getClass().getSimpleName(). Si c'est une classe anonyme, utilisez this.getClass().getSuperclass().getName()

29
MirroredFate

Vous pouvez utiliser this.getClass().getSimpleName(), comme ceci:

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

La combinaison des deux réponses. Imprime également un nom de méthode:

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

cette réponse est en retard, mais je pense qu'il y a une autre façon de faire cela dans le contexte de la classe de gestionnaire anonyme.

disons:

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

cela donnera le même résultat. de plus, c'est en fait assez pratique puisque chaque classe est définie au moment de la compilation, ainsi aucune dynamicité n'est endommagée.

au-dessus de cela, si la classe est vraiment imbriquée, c'est-à-dire que A est en fait entouré de B, la classe de B peut être facilement appelée:

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

Dans votre exemple, this fait probablement référence à une instance de classe anonyme. Java donne un nom à ces classes en ajoutant un $number au nom de la classe englobante.

2
tonio

Je suppose que cela se passe pour une classe anonyme. Lorsque vous créez une classe anonyme, vous créez en fait une classe qui étend la classe dont vous avez le nom.

La méthode "plus propre" pour obtenir le nom souhaité est la suivante:

Si votre classe est une classe interne anonyme, getSuperClass() devrait vous donner la classe à partir de laquelle elle a été créée. Si vous l'avez créé à partir d'une interface, vous êtes en quelque sorte SOL, car le mieux que vous puissiez faire est getInterfaces(), ce qui peut vous donner plus d'une interface.

Le "hacky" consiste simplement à obtenir le nom avec getClassName() et à utiliser une expression rationnelle pour supprimer le $1.

1
trutheality