Obtenir le nom d’une sous-classe dans une super-classe

Disons que j’ai une classe de base nommée Entity . Dans cette classe, j’ai une méthode statique pour récupérer le nom de la classe:

 class Entity { public static Ssortingng getClass() { return Entity.class.getClass(); } } 

Maintenant, j’ai une autre classe qui étend cela.

 class User extends Entity { } 

Je veux obtenir le nom de classe de l’utilisateur:

 System.out.println(User.getClass()); 

Mon but est de voir la sortie “com.packagename.User” sur la console, mais je vais plutôt me retrouver avec “com.packagename.Entity” car la classe Entity est référencée directement à partir de la méthode statique.

Si ce n’était pas une méthode statique, cela pourrait facilement être résolu en utilisant le mot this clé this dans la classe Entity (c’est-à-dire: return this.class.getClass() ). Cependant, j’ai besoin de cette méthode pour restr statique. Des suggestions sur la manière d’aborder cette question?

Pas possible. Les méthodes statiques ne sont pas polymorphes au moment de l’exécution. Il est absolument impossible de distinguer ces cas:

 System.out.println(Entity.getClass()); System.out.println(User.getClass()); 

Ils comstacknt dans le même code d’octet (en supposant que la méthode est définie dans Entity ).

En outre, comment appelleriez-vous cette méthode d’une manière où il serait logique qu’elle soit polymorphe?

Ne pas rendre la méthode statique. Le problème est que lorsque vous getClass() vous appelez la méthode dans la super classe – les méthodes statiques ne sont pas héritées. De plus, vous Object.getClass() essentiellement Object.getClass() , ce qui est déroutant.

Si vous devez enregistrer le nom de classe dans la superclasse, utilisez

 return this.getClass().getName(); 

Cela renverra “Entité” lorsque vous avez une instance Entity , “Utilisateur” lorsque vous avez une instance User , etc.

Votre question est ambiguë mais pour autant que je sache, vous voulez connaître la classe actuelle à partir d’une méthode statique. Le fait que les classes héritent les unes des autres n’est pas pertinent, mais pour le bien de la discussion, je l’ai également implémenté.

 classe Parent {
     public static void printClass () {
       System.out.println (Thread.currentThread (). GetStackTrace () [2] .getClassName ());
     }
 }

 test public class extend Parent {
     main statique vide statique (Ssortingng [] args) {
       printClass ();
     }
 }

Cela fonctionne pour moi

 this.getClass().asSubclass(this.getClass()) 

Mais je ne sais pas comment ça marche si.

La super-classe ne devrait même pas connaître l’existence de la sous-classe, et encore moins effectuer des opérations basées sur le nom qualifié complet de la sous-classe. Si vous avez besoin d’opérations basées sur la classe exacte et que vous ne pouvez pas exécuter la fonction nécessaire par inheritance, vous devriez faire quelque chose dans ce sens:

 public class MyClassUtil { public static Ssortingng doWorkBasedOnClass(Class clazz) { if(clazz == MyNormalClass.class) { // Stuff with MyNormalClass // Will not work for subclasses of MyNormalClass } if(isSubclassOf(clazz, MyNormalSuperclass.class)) { // Stuff with MyNormalSuperclass or any subclasses } // Similar code for interface implementations } private static boolean isSubclassOf(Class subclass, Class superclass) { if(subclass == superclass || superclass == Object.class) return true; while(subclass != superclass && subclass != Object.class) { subclass = subclass.getSuperclass(); } return false; } } 

(Code non testé)

Cette classe ne connaît pas non plus ses propres sous-classes, mais utilise plutôt la classe Class pour effectuer des opérations. Très probablement, cela restra étroitement lié aux implémentations (généralement une mauvaise chose, ou sinon c’est pas particulièrement bien ), mais je pense qu’une structure comme celle-ci est meilleure qu’une super-classe qui comprend toutes ses sous-classes.

Pourquoi voulez-vous implémenter votre propre méthode getClass ()? Vous pouvez simplement utiliser

 System.out.println(User.class); 

Edit (pour élaborer un peu): Vous voulez que la méthode soit statique. Dans ce cas, vous devez appeler la méthode sur la classe dont vous voulez le nom de classe, que ce soit la sous-classe ou la super-classe. Ensuite, au lieu d’appeler MyClass.getClass() , vous pouvez simplement appeler MyClass.class ou MyClass.class.getName() .

En outre, vous créez une méthode static avec la même signature que la méthode d’instance Object.getClass() , qui ne sera pas compilée.

  1. Créez une variable membre Ssortingng dans la superclasse.
  2. Ajoutez le this.getClass (). GetName () à un constructeur qui stocke la valeur dans la variable membre member.
  3. Créez un getter pour renvoyer le nom.

Chaque fois que la classe étendue est instanciée, son nom sera stocké dans la chaîne et accessible avec le getter.

Une méthode statique est associée à une classe, pas à un object spécifique.

Considérez comment cela fonctionnerait s’il y avait plusieurs sous-classes – par exemple, l’administrateur est également une entité. Comment votre méthode d’entité statique, associée uniquement à la classe Entity, saura-t-elle quelle sous-classe vous vouliez?

Vous pourriez:

  • Utilisez la méthode getClass () existante.
  • Transmettez un argument à votre méthode statique getClass () et appelez une méthode d’instance sur cet object.
  • Rendez votre méthode non statique et renommez-la.

Si je comprends bien votre question, je pense que la seule façon de réaliser ce que vous voulez est de ré-implémenter la méthode statique dans chaque sous-classe, par exemple:

 class Entity { public static Ssortingng getMyClass() { return Entity.class.getName(); } } class Derived extends Entity { public static Ssortingng getMyClass() { return Derived.class.getName(); } } 

Cela va imprimer le package.Entity et le package.Derived selon vos besoins. Messy mais bon, si ce sont vos contraintes …

Si je comprends bien, vous voulez utiliser votre sous-classe dans la classe de base en méthode statique Je pense que vous pouvez le faire en passant un paramètre de classe à la méthode

 class Entity { public static void useClass(Class c) { System.out.println(c); // to do code here } } class User extends Entity { } class main{ public static void main(Ssortingng[] args){ Entity.useClass(Entity.class); } } 

Mon contexte: super-classe Entité avec des sous-classes pour les objects XML. Ma solution: Créer une variable de classe dans la superclasse

 Class claz; 

Ensuite, dans la sous-classe, je définirais la variable de la superclasse dans le constructeur

 public class SubClass { public SubClass() { claz = this.getClass(); } } 

c’est très simple fait par

User.getClass (). GetSuperclass ()