package sample.duplicate; import javassist.tools.reflect.*; public class DuplicatedObject extends Metaobject { private DuplicatedObject backup; // if a base-level object is created, this metaobject creates // a copy of the base-level object. public DuplicatedObject(Object self, Object[] args) { super(self, args); ClassMetaobject clazz = getClassMetaobject(); if (clazz.isInstance(args[0])) backup = null; // self is a backup object. else { Object[] args2 = new Object[1]; args2[0] = self; try { Metalevel m = (Metalevel)clazz.newInstance(args2); backup = (DuplicatedObject)m._getMetaobject(); } catch (CannotCreateException e) { backup = null; } } } public Object trapMethodcall(int identifier, Object[] args) throws Throwable { Object obj = super.trapMethodcall(identifier, args); if (backup != null) backup.trapMethodcall(identifier, args); return obj; } }