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; | |
} | |
} |