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