The idea of having multiple sources of reflective information is not new. Smith's seminal work [30,31] explicitly accounts for the possibility of differing kinds of causal connection in reflective systems.
The ANSI Smalltalk standard [15] uses an abstract syntax specification to describe the global components of a Smalltalk program and their relationships. In particular, the work on Mirrors in Self [34], Animorphic Smalltalk [4], and Strongtalk [3] (as well as the Mirror interface in JDI) address concerns similar to ours from a programming language perspective [5]. Our extralingual approaches to pluggability should help inform the design and implementation of new reflection mechanisms at the language level.
While we use Java as our testbed, these concepts are valid for other languages. Even in a dynamically typed language such as Smalltalk, the implementation and interface are insufficiently decoupled to achieve pluggability. This becomes apparent when trying to retarget reflective Smalltalk code from a 3-metalevel system (e.g., in Little Smalltalk [6]) to a 5-metalevel system (e.g., in Squeak [17]).