xref: /aosp_15_r20/external/javassist/sample/duplicate/DuplicatedObject.java (revision f1fbf3c2ab775ce834e0af96b7a85bdc7a0eac65)
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