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();
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.
Essayez,
String className = this.getClass().getSimpleName();
Cela fonctionnera tant que vous ne l'utilisez pas dans une méthode statique.
Essayez d'utiliser ceci
this.getClass().getCanonicalName()
ou this.getClass().getSimpleName()
. Si c'est une classe anonyme, utilisez this.getClass().getSuperclass().getName()
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();
}
}
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()
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);
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.
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
.
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
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.