xref: /aosp_15_r20/external/javassist/src/test/javassist/proxyfactory/ProxyFactoryTest.java (revision f1fbf3c2ab775ce834e0af96b7a85bdc7a0eac65)
1 package javassist.proxyfactory;
2 
3 import javassist.util.proxy.MethodHandler;
4 import javassist.util.proxy.ProxyFactory;
5 import javassist.util.proxy.ProxyObject;
6 import junit.framework.TestCase;
7 
8 import java.io.*;
9 import java.lang.reflect.Method;
10 
11 /**
12  * <a href="mailto:[email protected]">Mark Struberg</a>
13  */
14 @SuppressWarnings({"rawtypes","unchecked","unused"})
15 public class ProxyFactoryTest extends TestCase {
testMethodHandlers()16     public void testMethodHandlers() throws Exception {
17         ProxyFactory fact = new ProxyFactory();
18         fact.setSuperclass(MyCls.class);
19 
20         Class proxyClass = fact.createClass();
21 
22         MyMethodHandler myHandler = new MyMethodHandler();
23         myHandler.setX(4711);
24 
25         MyCls myCls = (MyCls) proxyClass.getConstructor().newInstance();
26         ((ProxyObject) myCls).setHandler(myHandler);
27 
28         MethodHandler h2 = ((ProxyObject) myCls).getHandler();
29         assertNotNull(h2);
30         assertTrue(h2 instanceof MyMethodHandler);
31     }
32 
testSerialize()33     public void testSerialize() throws Exception {
34         ProxyFactory fact = new ProxyFactory();
35         fact.setSuperclass(MyCls.class);
36 
37         Class proxyClass = fact.createClass();
38 
39         MyMethodHandler myHandler = new MyMethodHandler();
40         myHandler.setX(4711);
41 
42         MyCls myCls = (MyCls) proxyClass.getConstructor().newInstance();
43         ((ProxyObject) myCls).setHandler(myHandler);
44 
45 
46         ByteArrayOutputStream baos = new ByteArrayOutputStream();
47         ObjectOutputStream oos = new ObjectOutputStream(baos);
48         oos.writeObject(myCls);
49         byte[] ba = baos.toByteArray();
50 
51         ByteArrayInputStream bais = new ByteArrayInputStream(ba);
52         ObjectInputStream ois = new ObjectInputStream(bais);
53         MyCls myCls2 =  (MyCls) ois.readObject();
54 
55         MethodHandler h2 = ((ProxyObject) myCls2).getHandler();
56         assertNotNull(h2);
57         assertTrue(h2 instanceof MyMethodHandler);
58     }
59 
60 
61     public static class MyMethodHandler implements MethodHandler, Serializable {
62 
63         /** default serialVersionUID */
64         private static final long serialVersionUID = 1L;
65         private int x;
66 
getX()67         public int getX() {
68             return x;
69         }
70 
setX(int x)71         public void setX(int x) {
72             this.x = x;
73         }
74 
invoke(Object self, Method thisMethod, Method proceed, Object[] args)75         public Object invoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable {
76             // actually do nothing!
77             return null;
78         }
79     }
80 
testJira127()81     public void testJira127() throws Exception {
82         ProxyFactory proxyFactory = new ProxyFactory();
83         proxyFactory.setInterfaces(new Class[]{ JIRA127Sub.class });
84         proxyFactory.createClass();
85     }
86 
87     public interface JIRA127 {
get()88         JIRA127 get();
89     }
90     public interface JIRA127Sub extends JIRA127 {
get()91         JIRA127Sub get();
92     }
93 
testDefaultMethod()94     public void testDefaultMethod() throws Exception {
95         ProxyFactory proxyFactory = new ProxyFactory();
96         //proxyFactory.writeDirectory = "./dump";
97         proxyFactory.setInterfaces(new Class[]{ TestDefaultI.class });
98         Class intf = proxyFactory.createClass();
99         TestDefaultI obj = (TestDefaultI)intf.getConstructor().newInstance();
100         obj.foo();
101 
102         ProxyFactory proxyFactory2 = new ProxyFactory();
103         //proxyFactory2.writeDirectory = "./dump";
104         proxyFactory2.setSuperclass(TestDefaultC.class);
105         Class clazz2 = proxyFactory2.createClass();
106         TestDefaultC obj2 = (TestDefaultC)clazz2.getConstructor().newInstance();
107         obj2.foo();
108         obj2.bar();
109 
110         ProxyFactory proxyFactory3 = new ProxyFactory();
111         proxyFactory3.setSuperclass(TestDefaultC2.class);
112         Class clazz3 = proxyFactory3.createClass();
113         TestDefaultC2 obj3 = (TestDefaultC2)clazz3.getConstructor().newInstance();
114         obj3.foo();
115         obj3.bar();
116         obj3.baz();
117     }
118 
119     public static interface TestDefaultI {
foo()120         default int foo() { return 10; }
121     }
122 
123     public static class TestDefaultC implements TestDefaultI {
foo()124         public int foo() { return 1; }
bar()125         public int bar() { return TestDefaultI.super.foo(); }
126     }
127 
128     public static class TestDefaultC2 extends TestDefaultC {
baz()129         public int baz() { return super.foo(); }
130     }
131 
testJava11()132     public void testJava11() throws Exception {
133         ProxyFactory factory = new ProxyFactory();
134         factory.setSuperclass(java.util.HashMap.class);
135         java.util.HashMap e = (java.util.HashMap)factory.create(null, null, new MethodHandler() {
136             @Override
137             public Object invoke(Object self, Method thisMethod,
138                     Method proceed, Object[] args) throws Throwable {
139                 return proceed.invoke(self, args);
140             }
141         });
142     }
143 
testJava11jdk()144     public void testJava11jdk() throws Exception {
145         ProxyFactory factory = new ProxyFactory();
146         factory.setSuperclass(jdk.javadoc.doclet.StandardDoclet.class);
147         jdk.javadoc.doclet.StandardDoclet e = (jdk.javadoc.doclet.StandardDoclet)factory.create(null, null, new MethodHandler() {
148             @Override
149             public Object invoke(Object self, Method thisMethod,
150                     Method proceed, Object[] args) throws Throwable {
151                 return proceed.invoke(self, args);
152             }
153         });
154     }
155 }
156