Par exemple, si j'exécute un script groovy, qui modifie la classe String Meta Classe, ajout d'une méthode FOO () lorsque je crée une nouvelle coque après cela et l'exécuter, le Les changements sont toujours là p> est un moyen d'annuler tous les changements de la classe méta après avoir exécuté le groovyshell? J'ai essayé p> et p> mais qui n'a pas fait de changement. P> p>
3 Réponses :
Vous pouvez utiliser
GroovySystem.metaClassRegistry.removeMetaClass(String.class);
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é.
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. P>
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). P >
@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.
Vous pouvez également utiliser MetaclassRegistrycleaner aussi.
Avant de faire des changements de métaclass, vous pouvez faire p> et lorsque vous souhaitez réinitialiser les modifications de la métaclass à l'état qu'ils étaient Plus tôt. p> Vous pouvez faire p> de cette façon, vous pouvez réinitialiser toutes les modifications de la métaclassis effectuées pendant la durée. P> P>
Puis-je faire cela avec un chargement de classe de classe?