11
votes

Comment puis-je annuler des changements de classe méta après avoir exécuté Groovyshell?

Par exemple, si j'exécute un script groovy, qui modifie la classe String Meta Classe, ajout d'une méthode FOO () xxx

lorsque je crée une nouvelle coque après cela et l'exécuter, le Les changements sont toujours là xxx

est un moyen d'annuler tous les changements de la classe méta après avoir exécuté le groovyshell? J'ai essayé xxx

et xxx

mais qui n'a pas fait de changement.


1 commentaires

Puis-je faire cela avec un chargement de classe de classe?


3 Réponses :


12
votes

Vous pouvez utiliser

GroovySystem.metaClassRegistry.removeMetaClass(String.class);


2 commentaires

Merci. Mais si je ne sais pas ce que les changements de méta-classe ont été apportés. Pensez à une application comme la console Web Groovy, où différents utilisateurs exécutent des scripts groovy. Je veux que ces utilisateurs n'interfèrent pas.


Consultez ma réponse ci-dessous, qui résout votre problème de ne pas savoir quelles métaclasses ont changé.



1
votes

Je me rends compte que c'est une question quelque peu plus âgée, mais c'est le premier résultat sur Google quand je cherchais exactement le même problème.

La solution que j'ai choisie était de mettre Groovy dans un nouveau chargeur de classe (en utilisant Plexus-Classworlds), donc lorsque le script est terminé, le chargeur de classe est disposé (et toute modification de la métaclasse est également disposée).


2 commentaires

@Johnmercier n'a pas mon réponse au-dessus de l'aide?


C'est une meilleure approche que le nettoyage du registre à bien des égards, en particulier pour permettre des exécutions simultanées.



2
votes

Vous pouvez également utiliser MetaclassRegistrycleaner aussi.

Avant de faire des changements de métaclass, vous pouvez faire xxx

et lorsque vous souhaitez réinitialiser les modifications de la métaclass à l'état qu'ils étaient Plus tôt.

Vous pouvez faire xxx

de cette façon, vous pouvez réinitialiser toutes les modifications de la métaclassis effectuées pendant la durée.


0 commentaires