10
votes

Java: Comment "redémarrer" une classe statique?

J'ai une classe statique (FOO) et une classe principale (principale)

voir Main.java:

java.lang.ClassCastException


5 commentaires

Pour cet exemple particulier, faites simplement foo.i = 0; à l'intérieur de votre méthode principale .


Vous avez la catégorie ClasscastException car la classe FOO chargée par l'URLClassloader est différente de celle de la classe FOO chargée par le chargeur de classe qui exécute votre code (ils ne sont pas ==). Même s'ils ont exactement la même définition, vous ne pouvez pas vous lancer une à l'autre. La seule façon dont ce type de travail est si FOO implémente une interface FOOINTERFACE chargée par un chargeur de classe partagé entre les deux chargeurs de classes, auquel cas vous pouvez vous lancer vers FOOINTERFACE. Mais cela ne vous aide pas à accéder aux champs statiques.


Namshubwriter: Ok, je l'ai fait ... Mais le problème principal est que j'utilise un type dynamique ... Je reçois "Fooclass ne peut pas être résolu à un type". Peut-être que quelque chose dans la reflete API peut aider ....


@Adrian a la bonne réponse. Ne faites rien de cela. Si nécessaire, créez une nouvelle interface entre votre test et la classe statique. La mise en œuvre par défaut de l'interface fournira les champs de la classe statique. Pour les tests, vous pouvez utiliser EasyMock ou simplement créer une nouvelle instance de cette interface qui renvoie les valeurs souhaitées. Ne plaisante pas avec le chargeur de classe ou le collecteur des ordures.


Connecté: Il semble que cela ne résout pas un problème (ou le fait-il) que je vais avoir comment exécuter correctement une micro-repère en Java. Cette solution oblige une chargeuse de classe à exécuter à chaque exécution (qui est tout le problème avec l'analyse comparative Java). Je voudrais que toutes les variables statiques soient réinitialisées, y compris tous les singletons, etc., de sorte que tout mon programme complet puisse être exécuté deux fois; La 2e course serait avec tout complètement chargé et est celle qui est hachée.


4 Réponses :


3
votes

Créer une méthode statique qui définit les variables de la classe à leurs valeurs initiales, puis l'appelez lorsque vous en avez besoin.


2 commentaires

C'est la voie la plus efficace.


J'ai une grande classe et je ne veux pas tout refroidir pour nettoyer les paramètres ... bien sûr, si je ne peux pas initialiser une classe, je devrai faire ça ... tks!



3
votes

Seulement si vous pouvez décharger la classe, obtenez-la rechargée, car le code statique de classe est exécuté lorsque la classe est chargée.

Mais vous pouvez simplement modifier directement la valeur: p>

Foo.i = 0;


1 commentaires

Pas facile; Ne fonctionne que si vous contrôlez réellement le chargeur de classe qui a été utilisé pour charger la classe (que vous ne le faites que si vous ne l'avez pas réellement construit). Mais si vous le faites, vous créez simplement un nouveau chargeur de classe, chargez une classe en l'utilisant. Cela n'affectera pas les instances existantes de la "vieille" classe, crée simplement une nouvelle définition de classe.



2
votes

Évitez les statiques.

Il est bien connu que la statique n'est pas testable et devrait donc être évitée. Par exemple, éviter les statiques est l'une des principales motivations de l'injection de dépendance. Si vous avez besoin d'une instance uniquement au moment de l'exécution, utilisez plutôt le motif singleton. Et créer une nouvelle instance pour chaque test de test.


1 commentaires

Oui, bien sûr, ça sonne bien, je vais juste voyager 20 ans de retour à temps pour dire aux personnes qui ont écrit le code Java Codebase, j'essaye d'écrire des tests pour "Hey, n'utilise pas statique"



-7
votes

Vous pouvez essayer cela.

Main MainObject = new Main;

MainObject.main(args);


0 commentaires