Wenn ich zum Beispiel ein Groovy-Skript ausführe, das die Meta-Klasse String ändert, füge eine Methode foo () hinzu
%Vor%Wenn ich danach eine neue Shell erzeuge und sie ausführe, sind die Änderungen immer noch da
%Vor%Gibt es eine Möglichkeit, alle Metaklassenänderungen nach dem Ausführen der GroovyShell rückgängig zu machen? Ich habe es versucht
%Vor%und
%Vor%aber das hat sich nicht geändert.
Sie können
verwenden %Vor%, um alle an der Meta-Klasse String vorgenommenen Änderungen rückgängig zu machen.
Alternativ könnten Sie nur die Meta-Klasse einer bestimmten String-Instanz ändern, daher wären nicht alle Instanzen von String betroffen.
Sie können auch MetaClassRegistryCleaner verwenden.
Bevor Sie Änderungen an Metaklassen vornehmen, können Sie
tun %Vor%Wenn Sie die Metaklasse zurücksetzen möchten, müssen Sie sie in den vorherigen Zustand versetzen.
Sie können
tun %Vor%Auf diese Weise können Sie alle während der Dauer vorgenommenen Metaklassenänderungen zurücksetzen.
Mir ist klar, dass dies eine etwas ältere Frage ist, aber es ist das erste Ergebnis bei Google, als ich genau das gleiche Problem suchte.
Die Lösung, die ich wählte, war, groovy in einen neuen Classloader zu packen (mit plexus-classworlds). Wenn das Script fertig ist, wird der Classloader entsorgt (und alle Änderungen an der Metaklasse werden ebenfalls entfernt).
Tags und Links groovy metaprogramming