Reflection is the ability of a program to manipulate as data something representing the state of the program during its own execution.
Reification is the process to transform implicit to explicit (objects)
A system having itself as application domain and that is causally connected with this domain can be qualified as a reflective system Maes'87
How does it access internal object state?
Accessing and setting object state
Object >> instVarAt: aNumber
Object >> instVarAt: aNumber put: anObject
Object >> instVarNamed: aString
Object >> instVarNamed: aString put: anObject
pt := 10@3.
pt instVarNamed: 'x'.
> 10
pt instVarNamed: 'x' put: 33.
pt
> 33@3
Object >> class
'hello' class
(10@3) class
Smalltalk class
Class class
Class class class
Class class class class
OrderedCollection allSuperclasses size.
OrderedCollection allSelectors size.
OrderedCollection allInstVarNames size.
OrderedCollection selectors size.
OrderedCollection instVarNames size.
OrderedCollection subclasses size.
OrderedCollection allSubclasses size.
OrderedCollection linesOfCode.
SystemNavigation default browseAllImplementorsOf: #,
Object >> perform: aSymbol
Object >> perform: aSymbol with: arg
5 factorial
5 perform: #factorial
CompiledMethod >> valueWithReceiver:arguments:
(Integer>>#factorial)
valueWithReceiver: 5 arguments: #()
(SmallInteger>>#factorial)
valueWithReceiver: 5 arguments: #()
/