1*f1fbf3c2SXin Li package testproxy; 2*f1fbf3c2SXin Li 3*f1fbf3c2SXin Li import java.lang.reflect.Method; 4*f1fbf3c2SXin Li import java.lang.reflect.Constructor; 5*f1fbf3c2SXin Li import java.lang.reflect.Modifier; 6*f1fbf3c2SXin Li 7*f1fbf3c2SXin Li import org.junit.Assert; 8*f1fbf3c2SXin Li 9*f1fbf3c2SXin Li import java.lang.reflect.InvocationTargetException; 10*f1fbf3c2SXin Li import javassist.util.proxy.ProxyFactory; 11*f1fbf3c2SXin Li import javassist.util.proxy.MethodFilter; 12*f1fbf3c2SXin Li import javassist.util.proxy.MethodHandler; 13*f1fbf3c2SXin Li import javassist.util.proxy.ProxyObject; 14*f1fbf3c2SXin Li import javassist.util.proxy.Proxy; 15*f1fbf3c2SXin Li import junit.framework.TestCase; 16*f1fbf3c2SXin Li import java.io.*; 17*f1fbf3c2SXin Li 18*f1fbf3c2SXin Li @SuppressWarnings({"unchecked", "rawtypes","unused"}) 19*f1fbf3c2SXin Li public class ProxyTester extends TestCase { ProxyTester(String s)20*f1fbf3c2SXin Li public ProxyTester(String s) { 21*f1fbf3c2SXin Li super(s); 22*f1fbf3c2SXin Li } 23*f1fbf3c2SXin Li ProxyTester()24*f1fbf3c2SXin Li public ProxyTester() { 25*f1fbf3c2SXin Li this("proxy"); 26*f1fbf3c2SXin Li } 27*f1fbf3c2SXin Li 28*f1fbf3c2SXin Li static class Interceptor1 implements MethodHandler { 29*f1fbf3c2SXin Li int counter = 0; 30*f1fbf3c2SXin Li invoke(Object self, Method m, Method proceed, Object[] args)31*f1fbf3c2SXin Li public Object invoke(Object self, Method m, Method proceed, 32*f1fbf3c2SXin Li Object[] args) throws Exception { 33*f1fbf3c2SXin Li System.out.println("intercept: " + m + ", proceed: " + proceed); 34*f1fbf3c2SXin Li System.out.println(" modifier: " 35*f1fbf3c2SXin Li + Modifier.toString(proceed.getModifiers())); 36*f1fbf3c2SXin Li counter++; 37*f1fbf3c2SXin Li return proceed.invoke(self, args); 38*f1fbf3c2SXin Li } 39*f1fbf3c2SXin Li } 40*f1fbf3c2SXin Li 41*f1fbf3c2SXin Li static class Interceptor2 implements MethodHandler { 42*f1fbf3c2SXin Li int counter = 0; invoke(Object self, Method m, Method proceed, Object[] args)43*f1fbf3c2SXin Li public Object invoke(Object self, Method m, Method proceed, 44*f1fbf3c2SXin Li Object[] args) throws Exception { 45*f1fbf3c2SXin Li System.out.println("intercept: " + m + ", proceed: " + proceed); 46*f1fbf3c2SXin Li counter++; 47*f1fbf3c2SXin Li if (proceed != null) 48*f1fbf3c2SXin Li return proceed.invoke(self, args); 49*f1fbf3c2SXin Li else 50*f1fbf3c2SXin Li if (m.getReturnType() == int.class) 51*f1fbf3c2SXin Li return Integer.valueOf(3); 52*f1fbf3c2SXin Li else 53*f1fbf3c2SXin Li return "OK"; 54*f1fbf3c2SXin Li } 55*f1fbf3c2SXin Li } 56*f1fbf3c2SXin Li 57*f1fbf3c2SXin Li static MethodFilter finalizeRemover = new MethodFilter() { 58*f1fbf3c2SXin Li public boolean isHandled(Method m) { 59*f1fbf3c2SXin Li return !m.getName().equals("finalize"); 60*f1fbf3c2SXin Li } 61*f1fbf3c2SXin Li }; 62*f1fbf3c2SXin Li testTarget()63*f1fbf3c2SXin Li public void testTarget() throws Exception { 64*f1fbf3c2SXin Li ProxyFactory f = new ProxyFactory(); 65*f1fbf3c2SXin Li f.setSuperclass(Target.class); 66*f1fbf3c2SXin Li Interceptor1 interceptor = new Interceptor1(); 67*f1fbf3c2SXin Li // f.setHandler(interceptor); 68*f1fbf3c2SXin Li f.setFilter(finalizeRemover); 69*f1fbf3c2SXin Li f.writeDirectory = "."; 70*f1fbf3c2SXin Li Class c = f.createClass(); 71*f1fbf3c2SXin Li Target obj = (Target)c.getConstructor().newInstance(); 72*f1fbf3c2SXin Li ((Proxy)obj).setHandler(interceptor); 73*f1fbf3c2SXin Li obj.m(); 74*f1fbf3c2SXin Li assertEquals(true, obj.m(true)); 75*f1fbf3c2SXin Li assertEquals((byte)1, obj.m1((byte)1)); 76*f1fbf3c2SXin Li assertEquals('a', obj.m2('a')); 77*f1fbf3c2SXin Li assertEquals((short)2, obj.m3((short)2)); 78*f1fbf3c2SXin Li assertEquals(3, obj.m(3)); 79*f1fbf3c2SXin Li assertEquals(4L, obj.m5(4L)); 80*f1fbf3c2SXin Li assertTrue(5.0F == obj.m6(5.0F)); 81*f1fbf3c2SXin Li assertTrue(6.0 == obj.m7(6.0)); 82*f1fbf3c2SXin Li assertEquals("test", obj.m("test")); 83*f1fbf3c2SXin Li int[] ia = { 1, 2, 3 }; 84*f1fbf3c2SXin Li assertEquals(ia, obj.m7(ia)); 85*f1fbf3c2SXin Li String[] sa = { "1", "2" }; 86*f1fbf3c2SXin Li assertEquals(sa, obj.m8(sa)); 87*f1fbf3c2SXin Li assertEquals(obj, obj.m9(3, obj, null)); 88*f1fbf3c2SXin Li assertEquals(14, interceptor.counter); 89*f1fbf3c2SXin Li } 90*f1fbf3c2SXin Li testTarget1()91*f1fbf3c2SXin Li public void testTarget1() throws Exception { 92*f1fbf3c2SXin Li ProxyFactory f = new ProxyFactory(); 93*f1fbf3c2SXin Li f.setSuperclass(Target1.class); 94*f1fbf3c2SXin Li Interceptor1 interceptor = new Interceptor1(); 95*f1fbf3c2SXin Li // f.setHandler(interceptor); 96*f1fbf3c2SXin Li f.setFilter(finalizeRemover); 97*f1fbf3c2SXin Li Class c = f.createClass(); 98*f1fbf3c2SXin Li Target1 obj = (Target1)c.getConstructor().newInstance(); 99*f1fbf3c2SXin Li ((Proxy)obj).setHandler(interceptor); 100*f1fbf3c2SXin Li assertEquals(null, obj.m(null)); 101*f1fbf3c2SXin Li assertEquals(1, interceptor.counter); 102*f1fbf3c2SXin Li } 103*f1fbf3c2SXin Li testObject()104*f1fbf3c2SXin Li public void testObject() throws Exception { 105*f1fbf3c2SXin Li ProxyFactory f = new ProxyFactory(); 106*f1fbf3c2SXin Li Interceptor1 interceptor = new Interceptor1(); 107*f1fbf3c2SXin Li // f.setHandler(interceptor); 108*f1fbf3c2SXin Li f.setFilter(finalizeRemover); 109*f1fbf3c2SXin Li Class c = f.createClass(); 110*f1fbf3c2SXin Li Object obj = (Object)c.getConstructor().newInstance(); 111*f1fbf3c2SXin Li ((Proxy)obj).setHandler(interceptor); 112*f1fbf3c2SXin Li System.out.println(obj.toString()); 113*f1fbf3c2SXin Li assertEquals(2, interceptor.counter); 114*f1fbf3c2SXin Li } 115*f1fbf3c2SXin Li testSetter()116*f1fbf3c2SXin Li public void testSetter() throws Exception { 117*f1fbf3c2SXin Li ProxyFactory f = new ProxyFactory(); 118*f1fbf3c2SXin Li f.writeDirectory = "."; 119*f1fbf3c2SXin Li Interceptor1 interceptor = new Interceptor1(); 120*f1fbf3c2SXin Li // f.setHandler(interceptor); 121*f1fbf3c2SXin Li f.setFilter(finalizeRemover); 122*f1fbf3c2SXin Li Class c = f.createClass(); 123*f1fbf3c2SXin Li Object obj = (Object)c.getConstructor().newInstance(); 124*f1fbf3c2SXin Li ((Proxy)obj).setHandler(interceptor); 125*f1fbf3c2SXin Li System.out.println("setter1: " + obj.toString()); 126*f1fbf3c2SXin Li ((ProxyObject)obj).setHandler(new MethodHandler() { 127*f1fbf3c2SXin Li public Object invoke(Object self, Method m, Method proceed, 128*f1fbf3c2SXin Li Object[] args) throws Exception { 129*f1fbf3c2SXin Li System.out.print("intercept: " + m); 130*f1fbf3c2SXin Li return "OK"; 131*f1fbf3c2SXin Li } 132*f1fbf3c2SXin Li }); 133*f1fbf3c2SXin Li assertEquals("OK", obj.toString()); 134*f1fbf3c2SXin Li } 135*f1fbf3c2SXin Li testString()136*f1fbf3c2SXin Li public void testString() throws Exception { 137*f1fbf3c2SXin Li ProxyFactory f = new ProxyFactory(); 138*f1fbf3c2SXin Li Interceptor1 interceptor = new Interceptor1(); 139*f1fbf3c2SXin Li // f.setHandler(interceptor); 140*f1fbf3c2SXin Li f.setFilter(finalizeRemover); 141*f1fbf3c2SXin Li f.setSuperclass(String.class); 142*f1fbf3c2SXin Li try { 143*f1fbf3c2SXin Li Class c = f.createClass(); 144*f1fbf3c2SXin Li Assert.fail("String is final!"); 145*f1fbf3c2SXin Li } 146*f1fbf3c2SXin Li catch (RuntimeException e) { 147*f1fbf3c2SXin Li System.out.println(e); 148*f1fbf3c2SXin Li } 149*f1fbf3c2SXin Li } 150*f1fbf3c2SXin Li testConstructor()151*f1fbf3c2SXin Li public void testConstructor() throws Exception { 152*f1fbf3c2SXin Li ProxyFactory f = new ProxyFactory(); 153*f1fbf3c2SXin Li Interceptor1 interceptor = new Interceptor1(); 154*f1fbf3c2SXin Li // f.setHandler(interceptor); 155*f1fbf3c2SXin Li f.setFilter(finalizeRemover); 156*f1fbf3c2SXin Li f.setSuperclass(Target2.class); 157*f1fbf3c2SXin Li Class c = f.createClass(); 158*f1fbf3c2SXin Li Constructor[] cons = c.getDeclaredConstructors(); 159*f1fbf3c2SXin Li assertEquals(3, cons.length); 160*f1fbf3c2SXin Li Constructor con1 = c.getDeclaredConstructor(new Class[] { int.class }); 161*f1fbf3c2SXin Li Constructor con2 = c.getDeclaredConstructor(new Class[] { int.class, int.class }); 162*f1fbf3c2SXin Li Method m1 = c.getDeclaredMethod("get", new Class[0]); 163*f1fbf3c2SXin Li Method m2 = c.getDeclaredMethod("foo", new Class[0]); 164*f1fbf3c2SXin Li assertEquals(0, m1.getExceptionTypes().length); 165*f1fbf3c2SXin Li assertEquals("java.io.IOException", m2.getExceptionTypes()[0].getName()); 166*f1fbf3c2SXin Li 167*f1fbf3c2SXin Li Target2 t2 = (Target2)con1.newInstance(new Object[] { Integer.valueOf(1) }); 168*f1fbf3c2SXin Li ((Proxy)t2).setHandler(interceptor); 169*f1fbf3c2SXin Li System.out.println(t2.toString()); 170*f1fbf3c2SXin Li assertEquals(2, interceptor.counter); 171*f1fbf3c2SXin Li 172*f1fbf3c2SXin Li interceptor.counter = 0; 173*f1fbf3c2SXin Li assertEquals(2, t2.foo()); 174*f1fbf3c2SXin Li assertEquals(4, t2._dfoo()); 175*f1fbf3c2SXin Li assertEquals(2, interceptor.counter); 176*f1fbf3c2SXin Li } 177*f1fbf3c2SXin Li testInterface()178*f1fbf3c2SXin Li public void testInterface() throws Exception { 179*f1fbf3c2SXin Li ProxyFactory f = new ProxyFactory(); 180*f1fbf3c2SXin Li Interceptor2 interceptor2 = new Interceptor2(); 181*f1fbf3c2SXin Li // f.setHandler(interceptor2); 182*f1fbf3c2SXin Li f.setFilter(finalizeRemover); 183*f1fbf3c2SXin Li f.setInterfaces(new Class[] { Target3.class }); 184*f1fbf3c2SXin Li Class c = f.createClass(); 185*f1fbf3c2SXin Li Target3 obj = (Target3)c.getConstructor().newInstance(); 186*f1fbf3c2SXin Li ((Proxy)obj).setHandler(interceptor2); 187*f1fbf3c2SXin Li assertEquals("OK", obj.m()); 188*f1fbf3c2SXin Li System.out.println(obj.toString()); 189*f1fbf3c2SXin Li assertEquals(3, interceptor2.counter); 190*f1fbf3c2SXin Li } 191*f1fbf3c2SXin Li test2Interfaces()192*f1fbf3c2SXin Li public void test2Interfaces() throws Exception { 193*f1fbf3c2SXin Li ProxyFactory f = new ProxyFactory(); 194*f1fbf3c2SXin Li Interceptor2 interceptor2 = new Interceptor2(); 195*f1fbf3c2SXin Li // f.setHandler(interceptor2); 196*f1fbf3c2SXin Li f.setFilter(finalizeRemover); 197*f1fbf3c2SXin Li f.setInterfaces(new Class[] { Target3.class, Target4.class }); 198*f1fbf3c2SXin Li Class c = f.createClass(); 199*f1fbf3c2SXin Li Target3 obj = (Target3)c.getConstructor().newInstance(); 200*f1fbf3c2SXin Li ((Proxy)obj).setHandler(interceptor2); 201*f1fbf3c2SXin Li assertEquals("OK", obj.m()); 202*f1fbf3c2SXin Li System.out.println(obj.toString()); 203*f1fbf3c2SXin Li assertEquals(3, interceptor2.counter); 204*f1fbf3c2SXin Li 205*f1fbf3c2SXin Li interceptor2.counter = 0; 206*f1fbf3c2SXin Li Target4 obj4 = (Target4)c.getConstructor().newInstance(); 207*f1fbf3c2SXin Li ((Proxy)obj4).setHandler(interceptor2); 208*f1fbf3c2SXin Li assertEquals(3, obj4.bar4()); 209*f1fbf3c2SXin Li assertEquals(3, obj4.foo4()); 210*f1fbf3c2SXin Li assertEquals(2, interceptor2.counter); 211*f1fbf3c2SXin Li } 212*f1fbf3c2SXin Li testFilter()213*f1fbf3c2SXin Li public void testFilter() throws Exception { 214*f1fbf3c2SXin Li ProxyFactory f = new ProxyFactory(); 215*f1fbf3c2SXin Li Interceptor2 interceptor2 = new Interceptor2(); 216*f1fbf3c2SXin Li // f.setHandler(interceptor2); 217*f1fbf3c2SXin Li f.setFilter(finalizeRemover); 218*f1fbf3c2SXin Li f.setInterfaces(new Class[] { Target3.class }); 219*f1fbf3c2SXin Li f.setFilter(new MethodFilter() { 220*f1fbf3c2SXin Li public boolean isHandled(Method m) { 221*f1fbf3c2SXin Li return m.getDeclaringClass() != Object.class; 222*f1fbf3c2SXin Li } 223*f1fbf3c2SXin Li }); 224*f1fbf3c2SXin Li Class c = f.createClass(); 225*f1fbf3c2SXin Li Target3 obj = (Target3)c.getConstructor().newInstance(); 226*f1fbf3c2SXin Li ((Proxy)obj).setHandler(interceptor2); 227*f1fbf3c2SXin Li assertEquals("OK", obj.m()); 228*f1fbf3c2SXin Li System.out.println(obj.toString()); 229*f1fbf3c2SXin Li assertEquals(1, interceptor2.counter); 230*f1fbf3c2SXin Li } 231*f1fbf3c2SXin Li 232*f1fbf3c2SXin Li public static boolean testInitFlag; 233*f1fbf3c2SXin Li testInit()234*f1fbf3c2SXin Li public void testInit() throws Exception { 235*f1fbf3c2SXin Li ProxyFactory f = new ProxyFactory(); 236*f1fbf3c2SXin Li f.setSuperclass(TargetInit.class); 237*f1fbf3c2SXin Li MethodHandler handler = new MethodHandler() { 238*f1fbf3c2SXin Li public Object invoke(Object self, Method m, 239*f1fbf3c2SXin Li Method proceed, Object[] args) throws Exception { 240*f1fbf3c2SXin Li System.out.println("testInit " + testInitFlag); 241*f1fbf3c2SXin Li return proceed.invoke(self, args); 242*f1fbf3c2SXin Li } 243*f1fbf3c2SXin Li }; 244*f1fbf3c2SXin Li testInitFlag = false; 245*f1fbf3c2SXin Li Class c = f.createClass(); 246*f1fbf3c2SXin Li assertTrue(testInitFlag); // since 3.12. Before then, this line was assertFalse(testInitFlag); 247*f1fbf3c2SXin Li System.out.println("testInit createClass(): " + testInitFlag); 248*f1fbf3c2SXin Li TargetInit obj = (TargetInit)c.getConstructor().newInstance(); 249*f1fbf3c2SXin Li assertTrue(testInitFlag); 250*f1fbf3c2SXin Li System.out.println("testInit newInstance(): " + testInitFlag); 251*f1fbf3c2SXin Li ((ProxyObject)obj).setHandler(handler); 252*f1fbf3c2SXin Li assertEquals("OK", obj.m()); 253*f1fbf3c2SXin Li } 254*f1fbf3c2SXin Li testCreate()255*f1fbf3c2SXin Li public void testCreate() throws Exception { 256*f1fbf3c2SXin Li ProxyFactory f = new ProxyFactory(); 257*f1fbf3c2SXin Li f.setSuperclass(Target5.class); 258*f1fbf3c2SXin Li Interceptor1 interceptor = new Interceptor1(); 259*f1fbf3c2SXin Li // f.setHandler(interceptor); 260*f1fbf3c2SXin Li f.setFilter(finalizeRemover); 261*f1fbf3c2SXin Li Class c = f.createClass(); 262*f1fbf3c2SXin Li Target5 obj = (Target5)f.create(new Class[] { int.class }, new Object[] { Integer.valueOf(3) }); 263*f1fbf3c2SXin Li ((Proxy)obj).setHandler(interceptor); 264*f1fbf3c2SXin Li assertEquals(3, obj.get()); 265*f1fbf3c2SXin Li } 266*f1fbf3c2SXin Li 267*f1fbf3c2SXin Li testBridgeMethod()268*f1fbf3c2SXin Li public void testBridgeMethod() throws Exception { 269*f1fbf3c2SXin Li ProxyFactory f = new ProxyFactory(); 270*f1fbf3c2SXin Li f.writeDirectory = "."; 271*f1fbf3c2SXin Li f.setSuperclass(BridgeMethod.class); 272*f1fbf3c2SXin Li Interceptor1 interceptor = new Interceptor1(); 273*f1fbf3c2SXin Li // f.setHandler(interceptor); 274*f1fbf3c2SXin Li f.setFilter(finalizeRemover); 275*f1fbf3c2SXin Li Class c = f.createClass(); 276*f1fbf3c2SXin Li BridgeMethod obj = (BridgeMethod)c.getConstructor().newInstance(); 277*f1fbf3c2SXin Li ((Proxy)obj).setHandler(interceptor); 278*f1fbf3c2SXin Li Integer value = obj.m1(); 279*f1fbf3c2SXin Li assertEquals(7, value.intValue()); 280*f1fbf3c2SXin Li BridgeMethodInf inf = (BridgeMethodInf)obj; 281*f1fbf3c2SXin Li Number num = inf.m1(); 282*f1fbf3c2SXin Li assertEquals(7, num.intValue()); 283*f1fbf3c2SXin Li BridgeMethodSuper sup = obj; 284*f1fbf3c2SXin Li try { 285*f1fbf3c2SXin Li Object x = sup.id(new Object()); 286*f1fbf3c2SXin Li fail("not cast error"); 287*f1fbf3c2SXin Li } 288*f1fbf3c2SXin Li catch (ClassCastException e) {} 289*f1fbf3c2SXin Li catch (Exception e) { 290*f1fbf3c2SXin Li if (e instanceof InvocationTargetException) 291*f1fbf3c2SXin Li if (e.getCause() instanceof ClassCastException) 292*f1fbf3c2SXin Li return; 293*f1fbf3c2SXin Li 294*f1fbf3c2SXin Li throw e; 295*f1fbf3c2SXin Li } 296*f1fbf3c2SXin Li } 297*f1fbf3c2SXin Li testGetters()298*f1fbf3c2SXin Li public void testGetters() throws Exception { 299*f1fbf3c2SXin Li ProxyFactory f = new ProxyFactory(); 300*f1fbf3c2SXin Li Class c = ProxyTester.class; 301*f1fbf3c2SXin Li f.setSuperclass(c); 302*f1fbf3c2SXin Li assertEquals(c, f.getSuperclass()); 303*f1fbf3c2SXin Li Class i = java.io.Serializable.class; 304*f1fbf3c2SXin Li f.setInterfaces(new Class[] { i }); 305*f1fbf3c2SXin Li assertEquals(i, f.getInterfaces()[0]); 306*f1fbf3c2SXin Li } 307*f1fbf3c2SXin Li 308*f1fbf3c2SXin Li static class ProxyFactory2 extends ProxyFactory { getClassLoader2()309*f1fbf3c2SXin Li public ClassLoader getClassLoader2() { 310*f1fbf3c2SXin Li return getClassLoader(); 311*f1fbf3c2SXin Li } 312*f1fbf3c2SXin Li } 313*f1fbf3c2SXin Li testProvider()314*f1fbf3c2SXin Li public void testProvider() throws Exception { 315*f1fbf3c2SXin Li ProxyFactory.ClassLoaderProvider cp = ProxyFactory.classLoaderProvider; 316*f1fbf3c2SXin Li try { 317*f1fbf3c2SXin Li final ClassLoader cl = Thread.currentThread().getContextClassLoader(); 318*f1fbf3c2SXin Li ProxyFactory.classLoaderProvider = new ProxyFactory.ClassLoaderProvider() { 319*f1fbf3c2SXin Li public ClassLoader get(ProxyFactory pf) { 320*f1fbf3c2SXin Li return Thread.currentThread().getContextClassLoader(); 321*f1fbf3c2SXin Li } 322*f1fbf3c2SXin Li }; 323*f1fbf3c2SXin Li 324*f1fbf3c2SXin Li ProxyFactory2 pf = new ProxyFactory2(); 325*f1fbf3c2SXin Li assertEquals(cl, pf.getClassLoader2()); 326*f1fbf3c2SXin Li } 327*f1fbf3c2SXin Li finally { 328*f1fbf3c2SXin Li ProxyFactory.classLoaderProvider = cp; 329*f1fbf3c2SXin Li } 330*f1fbf3c2SXin Li } 331*f1fbf3c2SXin Li 332*f1fbf3c2SXin Li @SuppressWarnings("deprecation") testCache()333*f1fbf3c2SXin Li public void testCache() throws Exception { 334*f1fbf3c2SXin Li boolean prev = ProxyFactory.useCache; 335*f1fbf3c2SXin Li ProxyFactory.useCache = true; 336*f1fbf3c2SXin Li ProxyFactory f = new ProxyFactory(); 337*f1fbf3c2SXin Li f.setSuperclass(Cache1.class); 338*f1fbf3c2SXin Li Class c = f.createClass(); 339*f1fbf3c2SXin Li ProxyFactory f2 = new ProxyFactory(); 340*f1fbf3c2SXin Li f2.setSuperclass(Cache1.class); 341*f1fbf3c2SXin Li assertEquals(c, f2.createClass()); 342*f1fbf3c2SXin Li ProxyFactory f3 = new ProxyFactory(); 343*f1fbf3c2SXin Li f3.setSuperclass(Cache1.class); 344*f1fbf3c2SXin Li f3.setHandler(new Interceptor1()); // deprecated 345*f1fbf3c2SXin Li assertFalse(c == f3.createClass()); 346*f1fbf3c2SXin Li ProxyFactory.useCache = true; 347*f1fbf3c2SXin Li ProxyFactory f4 = new ProxyFactory(); 348*f1fbf3c2SXin Li f4.setSuperclass(Cache1.class); 349*f1fbf3c2SXin Li f4.setInterfaces(new Class[] { Cache2.class }); 350*f1fbf3c2SXin Li Class c4 = f4.createClass(); 351*f1fbf3c2SXin Li assertFalse(c == c4); 352*f1fbf3c2SXin Li ProxyFactory f5 = new ProxyFactory(); 353*f1fbf3c2SXin Li f5.setSuperclass(Cache1.class); 354*f1fbf3c2SXin Li f5.setInterfaces(new Class[] { Cache2.class }); 355*f1fbf3c2SXin Li assertEquals(c4, f5.createClass()); 356*f1fbf3c2SXin Li ProxyFactory f6 = new ProxyFactory(); 357*f1fbf3c2SXin Li f6.setInterfaces(new Class[] { Cache2.class }); 358*f1fbf3c2SXin Li assertFalse(c4 == f6.createClass()); 359*f1fbf3c2SXin Li ProxyFactory.useCache = prev; 360*f1fbf3c2SXin Li } 361*f1fbf3c2SXin Li 362*f1fbf3c2SXin Li public static class Cache1 { foo()363*f1fbf3c2SXin Li public int foo() { return 0; } 364*f1fbf3c2SXin Li } 365*f1fbf3c2SXin Li 366*f1fbf3c2SXin Li public static interface Cache2 { bar()367*f1fbf3c2SXin Li public int bar(); 368*f1fbf3c2SXin Li } 369*f1fbf3c2SXin Li testReadWrite()370*f1fbf3c2SXin Li public void testReadWrite() throws Exception { 371*f1fbf3c2SXin Li final String fileName = "read-write.bin"; 372*f1fbf3c2SXin Li ProxyFactory.ClassLoaderProvider cp = ProxyFactory.classLoaderProvider; 373*f1fbf3c2SXin Li try { 374*f1fbf3c2SXin Li ProxyFactory.classLoaderProvider = new ProxyFactory.ClassLoaderProvider() { 375*f1fbf3c2SXin Li public ClassLoader get(ProxyFactory pf) { 376*f1fbf3c2SXin Li /* If javassist.Loader is returned, the super type of ReadWriteData class, 377*f1fbf3c2SXin Li * which is Serializable, is loaded by javassist.Loader as well as ReadWriteData. 378*f1fbf3c2SXin Li * This breaks the implementation of the object serializer. 379*f1fbf3c2SXin Li */ 380*f1fbf3c2SXin Li // return new javassist.Loader(); 381*f1fbf3c2SXin Li return Thread.currentThread().getContextClassLoader(); 382*f1fbf3c2SXin Li } 383*f1fbf3c2SXin Li }; 384*f1fbf3c2SXin Li ProxyFactory pf = new ProxyFactory(); 385*f1fbf3c2SXin Li pf.setSuperclass(ReadWriteData.class); 386*f1fbf3c2SXin Li Object data = pf.createClass().getConstructor().newInstance(); 387*f1fbf3c2SXin Li //Object data = new ReadWriteData(); 388*f1fbf3c2SXin Li ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName)); 389*f1fbf3c2SXin Li oos.writeObject(data); 390*f1fbf3c2SXin Li oos.close(); 391*f1fbf3c2SXin Li } 392*f1fbf3c2SXin Li finally { 393*f1fbf3c2SXin Li ProxyFactory.classLoaderProvider = cp; 394*f1fbf3c2SXin Li } 395*f1fbf3c2SXin Li 396*f1fbf3c2SXin Li ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName)); 397*f1fbf3c2SXin Li Object data2 = ois.readObject(); 398*f1fbf3c2SXin Li ois.close(); 399*f1fbf3c2SXin Li int i = ((ReadWriteData)data2).foo(); 400*f1fbf3c2SXin Li assertEquals(4, i); 401*f1fbf3c2SXin Li } 402*f1fbf3c2SXin Li 403*f1fbf3c2SXin Li public static class ReadWriteData implements Serializable { 404*f1fbf3c2SXin Li /** default serialVersionUID */ 405*f1fbf3c2SXin Li private static final long serialVersionUID = 1L; 406*f1fbf3c2SXin Li foo()407*f1fbf3c2SXin Li public int foo() { return 4; } 408*f1fbf3c2SXin Li } 409*f1fbf3c2SXin Li testWriteReplace()410*f1fbf3c2SXin Li public void testWriteReplace() throws Exception { 411*f1fbf3c2SXin Li ProxyFactory pf = new ProxyFactory(); 412*f1fbf3c2SXin Li pf.setSuperclass(WriteReplace.class); 413*f1fbf3c2SXin Li Object data = pf.createClass().getConstructor().newInstance(); 414*f1fbf3c2SXin Li assertEquals(data, ((WriteReplace)data).writeReplace()); 415*f1fbf3c2SXin Li 416*f1fbf3c2SXin Li ProxyFactory pf2 = new ProxyFactory(); 417*f1fbf3c2SXin Li pf2.setSuperclass(WriteReplace2.class); 418*f1fbf3c2SXin Li Object data2 = pf2.createClass().getConstructor().newInstance(); 419*f1fbf3c2SXin Li Method meth = data2.getClass().getDeclaredMethod("writeReplace", new Class[0]); 420*f1fbf3c2SXin Li assertEquals("javassist.util.proxy.SerializedProxy", 421*f1fbf3c2SXin Li meth.invoke(data2, new Object[0]).getClass().getName()); 422*f1fbf3c2SXin Li } 423*f1fbf3c2SXin Li 424*f1fbf3c2SXin Li public static class WriteReplace implements Serializable { 425*f1fbf3c2SXin Li /** default serialVersionUID */ 426*f1fbf3c2SXin Li private static final long serialVersionUID = 1L; 427*f1fbf3c2SXin Li writeReplace()428*f1fbf3c2SXin Li public Object writeReplace() { return this; } 429*f1fbf3c2SXin Li } 430*f1fbf3c2SXin Li 431*f1fbf3c2SXin Li public static class WriteReplace2 implements Serializable { 432*f1fbf3c2SXin Li /** default serialVersionUID */ 433*f1fbf3c2SXin Li private static final long serialVersionUID = 1L; 434*f1fbf3c2SXin Li writeReplace(int i)435*f1fbf3c2SXin Li public Object writeReplace(int i) { return Integer.valueOf(i); } 436*f1fbf3c2SXin Li } 437*f1fbf3c2SXin Li testJIRA189()438*f1fbf3c2SXin Li public static void testJIRA189() throws Exception { 439*f1fbf3c2SXin Li Class persistentClass = Target189.PublishedArticle.class; 440*f1fbf3c2SXin Li ProxyFactory factory = new ProxyFactory(); 441*f1fbf3c2SXin Li //factory.writeDirectory = "."; 442*f1fbf3c2SXin Li factory.setUseCache(false); 443*f1fbf3c2SXin Li factory.setSuperclass(persistentClass); 444*f1fbf3c2SXin Li factory.setInterfaces(new Class[] { Target189.TestProxy.class }); 445*f1fbf3c2SXin Li Class cl = factory.createClass(); 446*f1fbf3c2SXin Li Object obj = cl.getConstructor().newInstance(); 447*f1fbf3c2SXin Li System.out.println("JIRA189:" + obj.getClass().getClassLoader() + ", " + obj.getClass().getSuperclass().getName() 448*f1fbf3c2SXin Li + ", " + Target189.PublishedArticle.class.getClassLoader()); 449*f1fbf3c2SXin Li Target189.TestProxy proxy = (Target189.TestProxy)cl.getConstructor().newInstance(); 450*f1fbf3c2SXin Li Target189.TestMethodHandler methodHandler = new Target189.TestMethodHandler(); 451*f1fbf3c2SXin Li ((ProxyObject)proxy).setHandler(methodHandler); 452*f1fbf3c2SXin Li ((Target189.Article)proxy).getIssue(); 453*f1fbf3c2SXin Li assertTrue(methodHandler.wasInvokedOnce()); 454*f1fbf3c2SXin Li methodHandler.reset(); 455*f1fbf3c2SXin Li Target189.PublishedArticle article = (Target189.PublishedArticle)proxy; 456*f1fbf3c2SXin Li article.getIssue(); 457*f1fbf3c2SXin Li assertTrue(methodHandler.wasInvokedOnce()); 458*f1fbf3c2SXin Li } 459*f1fbf3c2SXin Li testJIRA127()460*f1fbf3c2SXin Li public void testJIRA127() throws Exception { 461*f1fbf3c2SXin Li ProxyFactory proxyFactory = new ProxyFactory(); 462*f1fbf3c2SXin Li // proxyFactory.writeDirectory = "."; 463*f1fbf3c2SXin Li proxyFactory.setInterfaces(new Class[]{ Target127.Sub.class }); 464*f1fbf3c2SXin Li Target127.Sub proxy = (Target127.Sub)proxyFactory.create(new Class[0], new Object[0], new MethodHandler() { 465*f1fbf3c2SXin Li public Object invoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable { 466*f1fbf3c2SXin Li return null; 467*f1fbf3c2SXin Li } 468*f1fbf3c2SXin Li }); 469*f1fbf3c2SXin Li ((Target127.Super)proxy).item(); // proxyFactory must generate a bridge method. 470*f1fbf3c2SXin Li ((Target127.Sub)proxy).item(); 471*f1fbf3c2SXin Li } 472*f1fbf3c2SXin Li main(String[] args)473*f1fbf3c2SXin Li public static void main(String[] args) { 474*f1fbf3c2SXin Li // javassist.bytecode.ClassFile.MAJOR_VERSION = javassist.bytecode.ClassFile.JAVA_6; 475*f1fbf3c2SXin Li junit.textui.TestRunner.run(ProxyTester.class); 476*f1fbf3c2SXin Li } 477*f1fbf3c2SXin Li } 478