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.

ProxyFactoryTest.java 5.7KB

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