0
votes

Passer le nom de la classe au constructeur de super classe à Scala par réflexion

Comment puis-je passer le nom d'une classe à son constructeur de super classe et est-ce même possible? Je pense à quelque chose comme ceci:

class TestClass extends SuperTestRequiringName(this.getClass.getName) {}


3 commentaires

Bien qu'il y ait de bonnes réponses à la question, la question elle-même est un signe que vous faites probablement quelque chose de mal. Tout d'abord, le code de la classe de base peut toujours obtenir le nom de la classe, tout en utilisant ceci.getclass . Ce ne ment jamais! Un autre problème est que si vous utilisez le nom de la sous-classe pour autre chose que la journalisation, vous faites probablement quelque chose de mal aussi mal. Si la bibliothèque demande au nom de la classe, elle demande peut-être un autre nom de classe? Pour résumer: Montrez-nous votre vrai problème et il pourrait y avoir une meilleure solution que cela.


@SERGGGR J'écris une classe de test abstraite censée réutiliser des objets lourds de poids, comme un système d'acteurs par sous-classe de béton et les éteignez uniquement dans le après le crochet Utilisation du trait OneInstancePertest , je vais donc créer un par cas de test autrement). Pour nommer le actorsystem et avoir une référence unique pour chaque sous-classe, je pensais qu'il serait raisonnable de simplement utiliser le nom de la classe. Depuis que je hérite d'une autre classe abstraite qui reçoit le système d'acteurs comme argument de constructeur, j'ai besoin de le créer juste là-bas.


J'ai mis à jour la question à affirmer explicitement que je suis intéressé par le nom de la classe d'exécution.


3 Réponses :


2
votes
class TestClass extends SuperTestRequiringName(classOf[TestClass].getName)
In Scala classOf[A] is the same as A.class in Java.getClass is a method, which you only can call on instances of classes.

1 commentaires

Merci, cela aide. Cependant, avoir accès au nom de la classe d'exécution réelle (il pourrait y avoir une autre sous-classe) serait encore meilleure. J'ai mis à jour la question à clarifier.



1
votes

Je ne sais pas si je comprends bien votre question ou non, mais vous pouvez utiliser classtag à cet effet. Par exemple; xxx

J'espère que cela aide!


1 commentaires

Merci, cela résout le problème de la cohérence lors du renommage. @ygor a posté une solution similaire. C'est un peu plus court. Dans ma compréhension, cela donne le même nom, n'est-ce pas? J'ai mis à jour ma question pour préciser en outre que je suis réellement intéressé par le nom de la classe d'exécution (sous-classe potentielle).



1
votes

Je ne pense pas que votre problème ait une bonne solution tel quel. La façon dont le modèle de mémoire JVM fonctionne, vous ne pouvez pas utiliser ceci avant l'appel sur le constructeur de base, même pour obtenir votre propre nom de classe. Si la raison pour laquelle vous héritez de la classe de la bibliothèque consiste à réutiliser ses fonctionnalités, plutôt que de la nécessité d'utiliser vos classes dans les mêmes contextes, la classe de base est utilisée, je suggérerais de remplacer l'héritage avec Composition Quelle est la bonne solution pour un tel problème de toute façon. Le code irait comme suit: xxx

Voir cet exemple .

Si vous avez vraiment besoin d'hériter de la gamme LibraryClass à utiliser dans ces contextes, vous devrez probablement faire passer vos sous-classes la chaîne explicitement comme dans la solution @ygor .


0 commentaires