169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpackage sample.duplicate; 269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.tools.reflect.*; 469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpublic class DuplicatedObject extends Metaobject { 669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private DuplicatedObject backup; 769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal // if a base-level object is created, this metaobject creates 969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal // a copy of the base-level object. 1069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 1169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public DuplicatedObject(Object self, Object[] args) { 1269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal super(self, args); 1369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ClassMetaobject clazz = getClassMetaobject(); 1469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (clazz.isInstance(args[0])) 1569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal backup = null; // self is a backup object. 1669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 1769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Object[] args2 = new Object[1]; 1869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal args2[0] = self; 1969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 2069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Metalevel m = (Metalevel)clazz.newInstance(args2); 2169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal backup = (DuplicatedObject)m._getMetaobject(); 2269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 2369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (CannotCreateException e) { 2469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal backup = null; 2569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 2669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 2769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 2869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 2969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public Object trapMethodcall(int identifier, Object[] args) 3069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws Throwable 3169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 3269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal Object obj = super.trapMethodcall(identifier, args); 3369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (backup != null) 3469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal backup.trapMethodcall(identifier, args); 3569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 3669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return obj; 3769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 3869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal} 39