1*f1fbf3c2SXin Li package sample.duplicate; 2*f1fbf3c2SXin Li 3*f1fbf3c2SXin Li import javassist.tools.reflect.*; 4*f1fbf3c2SXin Li 5*f1fbf3c2SXin Li public class DuplicatedObject extends Metaobject { 6*f1fbf3c2SXin Li private DuplicatedObject backup; 7*f1fbf3c2SXin Li 8*f1fbf3c2SXin Li // if a base-level object is created, this metaobject creates 9*f1fbf3c2SXin Li // a copy of the base-level object. 10*f1fbf3c2SXin Li DuplicatedObject(Object self, Object[] args)11*f1fbf3c2SXin Li public DuplicatedObject(Object self, Object[] args) { 12*f1fbf3c2SXin Li super(self, args); 13*f1fbf3c2SXin Li ClassMetaobject clazz = getClassMetaobject(); 14*f1fbf3c2SXin Li if (clazz.isInstance(args[0])) 15*f1fbf3c2SXin Li backup = null; // self is a backup object. 16*f1fbf3c2SXin Li else { 17*f1fbf3c2SXin Li Object[] args2 = new Object[1]; 18*f1fbf3c2SXin Li args2[0] = self; 19*f1fbf3c2SXin Li try { 20*f1fbf3c2SXin Li Metalevel m = (Metalevel)clazz.newInstance(args2); 21*f1fbf3c2SXin Li backup = (DuplicatedObject)m._getMetaobject(); 22*f1fbf3c2SXin Li } 23*f1fbf3c2SXin Li catch (CannotCreateException e) { 24*f1fbf3c2SXin Li backup = null; 25*f1fbf3c2SXin Li } 26*f1fbf3c2SXin Li } 27*f1fbf3c2SXin Li } 28*f1fbf3c2SXin Li trapMethodcall(int identifier, Object[] args)29*f1fbf3c2SXin Li public Object trapMethodcall(int identifier, Object[] args) 30*f1fbf3c2SXin Li throws Throwable 31*f1fbf3c2SXin Li { 32*f1fbf3c2SXin Li Object obj = super.trapMethodcall(identifier, args); 33*f1fbf3c2SXin Li if (backup != null) 34*f1fbf3c2SXin Li backup.trapMethodcall(identifier, args); 35*f1fbf3c2SXin Li 36*f1fbf3c2SXin Li return obj; 37*f1fbf3c2SXin Li } 38*f1fbf3c2SXin Li } 39