Java-récupère le nom de classe actuel?

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

String className = this.getClass().getName();
226
demandé sur David 2011-06-08 00:46:22

10 réponses

Le "$1" n'est pas "inutile non-sens". 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, alors 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 utilitaire statique.

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

214
répondu Bozho 2014-02-04 16:25:07

Essayez,

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

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

181
répondu jesg 2012-06-12 20:41:34

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

20
répondu MirroredFate 2018-03-02 07:47:08

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();
    }
}
8
répondu Karuna 2017-03-13 13:33:39

Cette réponse est en retard, mais je pense qu'il existe une autre façon de le faire 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();
                // ...
            }
        });
    }
}

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

Au-dessus de cela, si la classe est vraiment imbriquée, c'est-à-dire A est en fait entourée par B, La classe de B peut être facilement connue comme:

B.this.getClass().getName()
3
répondu HuStmpHrrr 2015-02-23 21:40:11

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
répondu SoftDesigner 2017-03-29 22:14:18

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
répondu tonio 2011-06-07 20:51:31

Je suppose que cela se produit pour une classe anonyme. Lorsque vous créez une classe anonyme créer une classe qui étend la classe dont le nom que vous avez obtenu.

La façon "plus propre" d'obtenir le nom que vous voulez est:

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 que vous êtes en quelque sorte SOL parce que le mieux que vous pouvez faire est getInterfaces() qui pourrait vous donner plus d'une interface.

Le la manière "hacky" est d'obtenir simplement le nom avec getClassName() et d'utiliser une expression rationnelle pour supprimer le $1.

1
répondu trutheality 2011-06-07 21:06:24

J'ai trouvé que cela fonctionnait pour mon code, mais mon code sort la classe d'un tableau dans une boucle for.

String className="";

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

System.out.print(className); //Use this to test it works
-3
répondu hransom 2017-02-13 14:05:41

API De Réflexion

Il existe plusieurs API de réflexion qui renvoient des classes mais celles-ci peuvent n'est accessible que si une classe a déjà été obtenue directement ou indirectement.

Class.getSuperclass()
     Returns the super class for the given class.

        Class c = javax.swing.JButton.class.getSuperclass();
        The super class of javax.swing.JButton is javax.swing.AbstractButton.

        Class.getClasses()

Renvoie toutes les classes, interfaces et énumérations publiques qui sont membres de la classe, y compris les membres hérités.

        Class<?>[] c = Character.class.getClasses();

Caractère contient deux classes de membre caractère.Sous-ensemble et
Caractère.UnicodeBlock.

        Class.getDeclaredClasses()
         Returns all of the classes interfaces, and enums that are explicitly declared in this class.

        Class<?>[] c = Character.class.getDeclaredClasses();
     Character contains two public member classes Character.Subset and Character.UnicodeBlock and one private class

Caractère.CharacterCache.

        Class.getDeclaringClass()
        java.lang.reflect.Field.getDeclaringClass()
        java.lang.reflect.Method.getDeclaringClass()
        java.lang.reflect.Constructor.getDeclaringClass()
     Returns the Class in which these members were declared. Anonymous Class Declarations will not have a declaring class but will

Ont une classe englobante.

        import java.lang.reflect.Field;

            Field f = System.class.getField("out");
            Class c = f.getDeclaringClass();
            The field out is declared in System.
            public class MyClass {
                static Object o = new Object() {
                    public void m() {} 
                };
                static Class<c> = o.getClass().getEnclosingClass();
            }

     The declaring class of the anonymous class defined by o is null.

    Class.getEnclosingClass()
     Returns the immediately enclosing class of the class.

    Class c = Thread.State.class().getEnclosingClass();
     The enclosing class of the enum Thread.State is Thread.

    public class MyClass {
        static Object o = new Object() { 
            public void m() {} 
        };
        static Class<c> = o.getClass().getEnclosingClass();
    }
     The anonymous class defined by o is enclosed by MyClass.
-3
répondu arunkumar sambu 2017-05-31 00:56:26