Many middleware platforms use computational reflection to support adaptive functionality. Most approaches intertwine the activity of observing behavior (introspection) with the activity of changing behavior (intercession). This paper explores the use of language constructs to separate these parts of reflective functionality. This separation and "packaging" of reflective primitives is intended to facilitate the design of correct and consistent adaptive middleware. A prototype language, called Adaptive Java, is described in which this functionality is realized through extensions to the Java programming language. A case study is described in which "metamorphic" socket components are created from regular socket classes and used to realize adaptive behavior on wireless network connections.