• [^] # Re: réflexif

    Posté par . En réponse à la dépêche GNU Smalltalk 3.2.3 et VisualGST 0.8.0. Évalué à 2.

    Je vais te donner quelques exemples:

    Avoir la classe d'un objet:

    anObject class

    appeler une methode

    anObject perform: #blabla with: 123

    Changer le contenu d'une variable d'instance:

    anObject instVarAt: 1 put: 123

    On peut aussi faire des choses amusantes:

    anObject changeClassTo: anObject (on a un prototype ;-) attention il faut faire d'autres changements pour que l'objet aie le format d'une classe qui lui est connu par la VM)

    Migration d'instances

    anOldObject become: aNewObject

    tous les objets ayant une reference anOldObject, cette reference sera remplacée par aNewObject.


    CompiledMethod allInstances retourne toutes les instances de la classes CompiledMethod.
    Ah et comme tu peux le voir les méthodes sont des objets comme les autres on peut donc les modifier, et faire d'autre choses comme de la couverture de code (pour les tests unitaires par exemple). On remplace des méthodes par des method wrapper ils vont être appelés a la place de la méthode et ils font ensuite leur boulot et vont appeler la bonne méthode ;-)

    Et encore plein d'autre choses on peut faire des variables d'instance first-class:

    MaClass>>maMethod: [
    des truc avants
    uneIVar := '123'.
    des truc apres
    ]

    uneIVar va envoyer les messages beforeChange et afterChange (il suffit de faire un peut de reecriture)

    J'oublie une chose importante le context d'exécution peut etre manipule: thisContext
    On peut facilement créer un debuggeur ou implémenter les exceptions en Smalltalk.

    Il y a encore plein d'autres choses comme les classe anonymes, ...