You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ProxyTester.java 17KB

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