Introducing distribution into applications: a reflective approach for transparency and dynamic fine-grained object allocation