diff options
author | chibash <chiba@javassist.org> | 2016-12-20 18:07:11 +0900 |
---|---|---|
committer | chibash <chiba@javassist.org> | 2016-12-20 18:07:11 +0900 |
commit | 6a3ed31976e54f2523a6e41dfee9001b3cce58c8 (patch) | |
tree | 2cf500a5eccad6e0603da59b7f121ab75ef4b0d3 | |
parent | 778c463e5aa1795591e56916c6c1c3205317fc3e (diff) | |
download | javassist-6a3ed31976e54f2523a6e41dfee9001b3cce58c8.tar.gz javassist-6a3ed31976e54f2523a6e41dfee9001b3cce58c8.zip |
updates the test code to run on Java 9 EA+149.
Due to the specification change of jigsaw, ClassLoader#defineClass()
cannot be invoked through reflection API. As a workaround,
--add-opens java.base/java.lang=ALL-UNNAMED
must be given to the JVM. The ant target "runtest9" adds this jvm
argument.
-rw-r--r-- | build.xml | 12 | ||||
-rw-r--r-- | javassist.jar | bin | 725109 -> 722743 bytes | |||
-rw-r--r-- | src/main/javassist/ClassPoolTail.java | 2 | ||||
-rw-r--r-- | src/test/javassist/JvstTest.java | 4 | ||||
-rw-r--r-- | src/test/javassist/JvstTest2.java | 29 | ||||
-rw-r--r-- | src/test/test/javassist/proxy/ProxySimpleTest.java | 36 | ||||
-rw-r--r-- | src/test/testproxy/ProxyTester.java | 914 |
7 files changed, 523 insertions, 474 deletions
@@ -99,7 +99,17 @@ <target name="runtest" depends="jar,test-compile"> <junit fork="true" printsummary="true" dir="${test.run.dir}"> - <jvmarg value="-XX:-FailOverToOldVerifier" /> + <jvmarg value="-XX:-FailOverToOldVerifier"/> + <classpath refid="test.classpath"/> + <formatter type="xml" extension=".xml"/> + <test name="javassist.JvstTest" outfile="TestLog" /> + </junit> + </target> + + <target name="runtest9" depends="jar,test-compile"> + <junit fork="true" printsummary="true" dir="${test.run.dir}"> + <jvmarg line="--add-opens java.base/java.lang=ALL-UNNAMED" /> + <jvmarg value="-XX:-FailOverToOldVerifier"/> <classpath refid="test.classpath"/> <formatter type="xml" extension=".xml"/> <test name="javassist.JvstTest" outfile="TestLog" /> diff --git a/javassist.jar b/javassist.jar Binary files differindex 83712459..5083ca75 100644 --- a/javassist.jar +++ b/javassist.jar diff --git a/src/main/javassist/ClassPoolTail.java b/src/main/javassist/ClassPoolTail.java index 13d22d77..681c550e 100644 --- a/src/main/javassist/ClassPoolTail.java +++ b/src/main/javassist/ClassPoolTail.java @@ -241,7 +241,7 @@ final class ClassPoolTail { public ClassPath appendSystemPath() { ClassLoader cl = Thread.currentThread().getContextClassLoader(); - return appendClassPath(new LoaderClassPath(cl, true)); + return appendClassPath(new LoaderClassPath(cl)); } public ClassPath insertClassPath(String pathname) diff --git a/src/test/javassist/JvstTest.java b/src/test/javassist/JvstTest.java index eb57a643..550d4278 100644 --- a/src/test/javassist/JvstTest.java +++ b/src/test/javassist/JvstTest.java @@ -8,8 +8,12 @@ import javassist.expr.*; import javassist.runtime.*; public class JvstTest extends JvstTestRoot { + public static boolean java9; + static { //javassist.bytecode.MethodInfo.doPreverify = true; + java9 = javassist.bytecode.ClassFile.MAJOR_VERSION + >= javassist.bytecode.ClassFile.JAVA_9; } public JvstTest(String name) { super(name); diff --git a/src/test/javassist/JvstTest2.java b/src/test/javassist/JvstTest2.java index 10d5d3e3..443bbb30 100644 --- a/src/test/javassist/JvstTest2.java +++ b/src/test/javassist/JvstTest2.java @@ -295,8 +295,12 @@ public class JvstTest2 extends JvstTestRoot { url = cp.find("java.lang.Object").toString(); System.out.println(url); - assertTrue(url.startsWith("jar:file:")); - assertTrue(url.endsWith(".jar!/java/lang/Object.class")); + if (JvstTest.java9) + assertEquals("jrt:/java.base/java/lang/Object.class", url); + else { + assertTrue(url.startsWith("jar:file:")); + assertTrue(url.endsWith(".jar!/java/lang/Object.class")); + } assertNull(cp.find("class.not.Exist")); @@ -304,7 +308,7 @@ public class JvstTest2 extends JvstTestRoot { cp.insertClassPath("."); url = cp.find("test2.Inner").toString(); - System.out.println(url); + System.out.println("testURL: " + url); assertTrue(url.startsWith("file:/")); assertTrue(url.endsWith("/test2/Inner.class")); @@ -314,7 +318,7 @@ public class JvstTest2 extends JvstTestRoot { cp.insertClassPath(JAR_PATH + "javassist.jar"); url = cp.find("javassist.CtClass").toString(); - System.out.println(url); + System.out.println("testURL: " + url); assertTrue(url.startsWith("jar:file:")); assertTrue(url.endsWith("javassist.jar!/javassist/CtClass.class")); @@ -324,9 +328,9 @@ public class JvstTest2 extends JvstTestRoot { cp.insertClassPath(new LoaderClassPath(cloader)); url = cp.find("javassist.CtMethod").toString(); - System.out.println(url); - // assertTrue(url.startsWith("jar:file:")); - // assertTrue(url.endsWith("javassist.jar!/javassist/CtMethod.class")); + System.out.println("testURL: " + url); + assertTrue(url.startsWith("file:")); + assertTrue(url.endsWith("/javassist/CtMethod.class")); assertNull(cp.find("javassist.TestURL")); @@ -334,7 +338,7 @@ public class JvstTest2 extends JvstTestRoot { cp.insertClassPath(new ByteArrayClassPath("test2.ByteArray", null)); url = cp.find("test2.ByteArray").toString(); - System.out.println(url); + System.out.println("testURL: " + url); assertTrue( url.equals("file:/ByteArrayClassPath/test2/ByteArray.class")); @@ -361,8 +365,13 @@ public class JvstTest2 extends JvstTestRoot { CtClass cc = sloader.get("java.lang.String"); String url = cc.getURL().toString(); System.out.println(url); - assertTrue(url.startsWith("jar:file:")); - assertTrue(url.endsWith(".jar!/java/lang/String.class")); + if (JvstTest.java9) { + assertEquals("jrt:/java.base/java/lang/String.class", url); + } + else { + assertTrue(url.startsWith("jar:file:")); + assertTrue(url.endsWith(".jar!/java/lang/String.class")); + } cc = sloader.get("int"); try { diff --git a/src/test/test/javassist/proxy/ProxySimpleTest.java b/src/test/test/javassist/proxy/ProxySimpleTest.java index 42a4f443..249a2542 100644 --- a/src/test/test/javassist/proxy/ProxySimpleTest.java +++ b/src/test/test/javassist/proxy/ProxySimpleTest.java @@ -1,6 +1,7 @@ package test.javassist.proxy; import junit.framework.TestCase; +import testproxy.ProxyTester.ReadWriteData; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -53,19 +54,28 @@ public class ProxySimpleTest extends TestCase { public void testReadWrite() throws Exception { final String fileName = "read-write.bin"; ProxyFactory.ClassLoaderProvider cp = ProxyFactory.classLoaderProvider; - ProxyFactory.classLoaderProvider = new ProxyFactory.ClassLoaderProvider() { - public ClassLoader get(ProxyFactory pf) { - return new javassist.Loader(); - } - }; - ProxyFactory pf = new ProxyFactory(); - pf.setSuperclass(ReadWriteData.class); - Object data = pf.createClass().getConstructor().newInstance(); - // Object data = new ReadWriteData(); - ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName)); - oos.writeObject(data); - oos.close(); - ProxyFactory.classLoaderProvider = cp; + try { + ProxyFactory.classLoaderProvider = new ProxyFactory.ClassLoaderProvider() { + public ClassLoader get(ProxyFactory pf) { + /* If javassist.Loader is returned, the super type of ReadWriteData class, + * which is Serializable, is loaded by javassist.Loader as well as ReadWriteData. + * This breaks the implementation of the object serializer. + */ + // return new javassist.Loader(); + return Thread.currentThread().getContextClassLoader(); + } + }; + ProxyFactory pf = new ProxyFactory(); + pf.setSuperclass(ReadWriteData.class); + Object data = pf.createClass().getConstructor().newInstance(); + // Object data = new ReadWriteData(); + ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName)); + oos.writeObject(data); + oos.close(); + } + finally { + ProxyFactory.classLoaderProvider = cp; + } ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName)); Object data2 = ois.readObject(); diff --git a/src/test/testproxy/ProxyTester.java b/src/test/testproxy/ProxyTester.java index 07ae54d2..f325997d 100644 --- a/src/test/testproxy/ProxyTester.java +++ b/src/test/testproxy/ProxyTester.java @@ -1,449 +1,465 @@ -package testproxy;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.InvocationTargetException;
-import javassist.util.proxy.ProxyFactory;
-import javassist.util.proxy.MethodFilter;
-import javassist.util.proxy.MethodHandler;
-import javassist.util.proxy.ProxyObject;
-import javassist.util.proxy.Proxy;
-import junit.framework.Assert;
-import junit.framework.TestCase;
-import java.io.*;
-
-public class ProxyTester extends TestCase {
- public ProxyTester(String s) {
- super(s);
- }
-
- public ProxyTester() {
- this("proxy");
- }
-
- static class Interceptor1 implements MethodHandler {
- int counter = 0;
-
- public Object invoke(Object self, Method m, Method proceed,
- Object[] args) throws Exception {
- System.out.println("intercept: " + m + ", proceed: " + proceed);
- System.out.println(" modifier: "
- + Modifier.toString(proceed.getModifiers()));
- counter++;
- return proceed.invoke(self, args);
- }
- }
-
- static class Interceptor2 implements MethodHandler {
- int counter = 0;
- public Object invoke(Object self, Method m, Method proceed,
- Object[] args) throws Exception {
- System.out.println("intercept: " + m + ", proceed: " + proceed);
- counter++;
- if (proceed != null)
- return proceed.invoke(self, args);
- else
- if (m.getReturnType() == int.class)
- return Integer.valueOf(3);
- else
- return "OK";
- }
- }
-
- static MethodFilter finalizeRemover = new MethodFilter() {
- public boolean isHandled(Method m) {
- return !m.getName().equals("finalize");
- }
- };
-
- public void testTarget() throws Exception {
- ProxyFactory f = new ProxyFactory();
- f.setSuperclass(Target.class);
- Interceptor1 interceptor = new Interceptor1();
- // f.setHandler(interceptor);
- f.setFilter(finalizeRemover);
- f.writeDirectory = ".";
- Class c = f.createClass();
- Target obj = (Target)c.getConstructor().newInstance();
- ((Proxy)obj).setHandler(interceptor);
- obj.m();
- assertEquals(true, obj.m(true));
- assertEquals((byte)1, obj.m1((byte)1));
- assertEquals('a', obj.m2('a'));
- assertEquals((short)2, obj.m3((short)2));
- assertEquals(3, obj.m(3));
- assertEquals(4L, obj.m5(4L));
- assertTrue(5.0F == obj.m6(5.0F));
- assertTrue(6.0 == obj.m7(6.0));
- assertEquals("test", obj.m("test"));
- int[] ia = { 1, 2, 3 };
- assertEquals(ia, obj.m7(ia));
- String[] sa = { "1", "2" };
- assertEquals(sa, obj.m8(sa));
- assertEquals(obj, obj.m9(3, obj, null));
- assertEquals(14, interceptor.counter);
- }
-
- public void testTarget1() throws Exception {
- ProxyFactory f = new ProxyFactory();
- f.setSuperclass(Target1.class);
- Interceptor1 interceptor = new Interceptor1();
- // f.setHandler(interceptor);
- f.setFilter(finalizeRemover);
- Class c = f.createClass();
- Target1 obj = (Target1)c.getConstructor().newInstance();
- ((Proxy)obj).setHandler(interceptor);
- assertEquals(null, obj.m(null));
- assertEquals(1, interceptor.counter);
- }
-
- public void testObject() throws Exception {
- ProxyFactory f = new ProxyFactory();
- Interceptor1 interceptor = new Interceptor1();
- // f.setHandler(interceptor);
- f.setFilter(finalizeRemover);
- Class c = f.createClass();
- Object obj = (Object)c.getConstructor().newInstance();
- ((Proxy)obj).setHandler(interceptor);
- System.out.println(obj.toString());
- assertEquals(2, interceptor.counter);
- }
-
- public void testSetter() throws Exception {
- ProxyFactory f = new ProxyFactory();
- f.writeDirectory = ".";
- Interceptor1 interceptor = new Interceptor1();
- // f.setHandler(interceptor);
- f.setFilter(finalizeRemover);
- Class c = f.createClass();
- Object obj = (Object)c.getConstructor().newInstance();
- ((Proxy)obj).setHandler(interceptor);
- System.out.println("setter1: " + obj.toString());
- ((ProxyObject)obj).setHandler(new MethodHandler() {
- public Object invoke(Object self, Method m, Method proceed,
- Object[] args) throws Exception {
- System.out.print("intercept: " + m);
- return "OK";
- }
- });
- assertEquals("OK", obj.toString());
- }
-
- public void testString() throws Exception {
- ProxyFactory f = new ProxyFactory();
- Interceptor1 interceptor = new Interceptor1();
- // f.setHandler(interceptor);
- f.setFilter(finalizeRemover);
- f.setSuperclass(String.class);
- try {
- Class c = f.createClass();
- Assert.fail("String is final!");
- }
- catch (RuntimeException e) {
- System.out.println(e);
- }
- }
-
- public void testConstructor() throws Exception {
- ProxyFactory f = new ProxyFactory();
- Interceptor1 interceptor = new Interceptor1();
- // f.setHandler(interceptor);
- f.setFilter(finalizeRemover);
- f.setSuperclass(Target2.class);
- Class c = f.createClass();
- Constructor[] cons = c.getDeclaredConstructors();
- assertEquals(3, cons.length);
- Constructor con1 = c.getDeclaredConstructor(new Class[] { int.class });
- Constructor con2 = c.getDeclaredConstructor(new Class[] { int.class, int.class });
- Method m1 = c.getDeclaredMethod("get", new Class[0]);
- Method m2 = c.getDeclaredMethod("foo", new Class[0]);
- assertEquals(0, m1.getExceptionTypes().length);
- assertEquals("java.io.IOException", m2.getExceptionTypes()[0].getName());
-
- Target2 t2 = (Target2)con1.newInstance(new Object[] { Integer.valueOf(1) });
- ((Proxy)t2).setHandler(interceptor);
- System.out.println(t2.toString());
- assertEquals(2, interceptor.counter);
-
- interceptor.counter = 0;
- assertEquals(2, t2.foo());
- assertEquals(4, t2._dfoo());
- assertEquals(2, interceptor.counter);
- }
-
- public void testInterface() throws Exception {
- ProxyFactory f = new ProxyFactory();
- Interceptor2 interceptor2 = new Interceptor2();
- // f.setHandler(interceptor2);
- f.setFilter(finalizeRemover);
- f.setInterfaces(new Class[] { Target3.class });
- Class c = f.createClass();
- Target3 obj = (Target3)c.getConstructor().newInstance();
- ((Proxy)obj).setHandler(interceptor2);
- assertEquals("OK", obj.m());
- System.out.println(obj.toString());
- assertEquals(3, interceptor2.counter);
- }
-
- public void test2Interfaces() throws Exception {
- ProxyFactory f = new ProxyFactory();
- Interceptor2 interceptor2 = new Interceptor2();
- // f.setHandler(interceptor2);
- f.setFilter(finalizeRemover);
- f.setInterfaces(new Class[] { Target3.class, Target4.class });
- Class c = f.createClass();
- Target3 obj = (Target3)c.getConstructor().newInstance();
- ((Proxy)obj).setHandler(interceptor2);
- assertEquals("OK", obj.m());
- System.out.println(obj.toString());
- assertEquals(3, interceptor2.counter);
-
- interceptor2.counter = 0;
- Target4 obj4 = (Target4)c.getConstructor().newInstance();
- ((Proxy)obj4).setHandler(interceptor2);
- assertEquals(3, obj4.bar4());
- assertEquals(3, obj4.foo4());
- assertEquals(2, interceptor2.counter);
- }
-
- public void testFilter() throws Exception {
- ProxyFactory f = new ProxyFactory();
- Interceptor2 interceptor2 = new Interceptor2();
- // f.setHandler(interceptor2);
- f.setFilter(finalizeRemover);
- f.setInterfaces(new Class[] { Target3.class });
- f.setFilter(new MethodFilter() {
- public boolean isHandled(Method m) {
- return m.getDeclaringClass() != Object.class;
- }
- });
- Class c = f.createClass();
- Target3 obj = (Target3)c.getConstructor().newInstance();
- ((Proxy)obj).setHandler(interceptor2);
- assertEquals("OK", obj.m());
- System.out.println(obj.toString());
- assertEquals(1, interceptor2.counter);
- }
-
- public static boolean testInitFlag;
-
- public void testInit() throws Exception {
- ProxyFactory f = new ProxyFactory();
- f.setSuperclass(TargetInit.class);
- MethodHandler handler = new MethodHandler() {
- public Object invoke(Object self, Method m,
- Method proceed, Object[] args) throws Exception {
- System.out.println("testInit " + testInitFlag);
- return proceed.invoke(self, args);
- }
- };
- testInitFlag = false;
- Class c = f.createClass();
- assertTrue(testInitFlag); // since 3.12. Before then, this line was assertFalse(testInitFlag);
- System.out.println("testInit createClass(): " + testInitFlag);
- TargetInit obj = (TargetInit)c.getConstructor().newInstance();
- assertTrue(testInitFlag);
- System.out.println("testInit newInstance(): " + testInitFlag);
- ((ProxyObject)obj).setHandler(handler);
- assertEquals("OK", obj.m());
- }
-
- public void testCreate() throws Exception {
- ProxyFactory f = new ProxyFactory();
- f.setSuperclass(Target5.class);
- Interceptor1 interceptor = new Interceptor1();
- // f.setHandler(interceptor);
- f.setFilter(finalizeRemover);
- Class c = f.createClass();
- Target5 obj = (Target5)f.create(new Class[] { int.class }, new Object[] { Integer.valueOf(3) });
- ((Proxy)obj).setHandler(interceptor);
- assertEquals(3, obj.get());
- }
-
-
- public void testBridgeMethod() throws Exception {
- ProxyFactory f = new ProxyFactory();
- f.writeDirectory = ".";
- f.setSuperclass(BridgeMethod.class);
- Interceptor1 interceptor = new Interceptor1();
- // f.setHandler(interceptor);
- f.setFilter(finalizeRemover);
- Class c = f.createClass();
- BridgeMethod obj = (BridgeMethod)c.getConstructor().newInstance();
- ((Proxy)obj).setHandler(interceptor);
- Integer value = obj.m1();
- assertEquals(7, value.intValue());
- BridgeMethodInf inf = (BridgeMethodInf)obj;
- Number num = inf.m1();
- assertEquals(7, num.intValue());
- BridgeMethodSuper sup = obj;
- try {
- Object x = sup.id(new Object());
- fail("not cast error");
- }
- catch (ClassCastException e) {}
- catch (Exception e) {
- if (e instanceof InvocationTargetException)
- if (e.getCause() instanceof ClassCastException)
- return;
-
- throw e;
- }
- }
-
- public void testGetters() throws Exception {
- ProxyFactory f = new ProxyFactory();
- Class c = ProxyTester.class;
- f.setSuperclass(c);
- assertEquals(c, f.getSuperclass());
- Class i = java.io.Serializable.class;
- f.setInterfaces(new Class[] { i });
- assertEquals(i, f.getInterfaces()[0]);
- }
-
- static class ProxyFactory2 extends ProxyFactory {
- public ClassLoader getClassLoader2() {
- return getClassLoader();
- }
- }
-
- public void testProvider() throws Exception {
- ProxyFactory.ClassLoaderProvider cp = ProxyFactory.classLoaderProvider;
- final ClassLoader cl = Thread.currentThread().getContextClassLoader();
- ProxyFactory.classLoaderProvider = new ProxyFactory.ClassLoaderProvider() {
- public ClassLoader get(ProxyFactory pf) {
- return Thread.currentThread().getContextClassLoader();
- }
- };
-
- ProxyFactory2 pf = new ProxyFactory2();
- assertEquals(cl, pf.getClassLoader2());
- ProxyFactory.classLoaderProvider = cp;
- }
-
- @SuppressWarnings("deprecation")
- public void testCache() throws Exception {
- boolean prev = ProxyFactory.useCache;
- ProxyFactory.useCache = true;
- ProxyFactory f = new ProxyFactory();
- f.setSuperclass(Cache1.class);
- Class c = f.createClass();
- ProxyFactory f2 = new ProxyFactory();
- f2.setSuperclass(Cache1.class);
- assertEquals(c, f2.createClass());
- ProxyFactory f3 = new ProxyFactory();
- f3.setSuperclass(Cache1.class);
- f3.setHandler(new Interceptor1()); // deprecated
- assertFalse(c == f3.createClass());
- ProxyFactory.useCache = true;
- ProxyFactory f4 = new ProxyFactory();
- f4.setSuperclass(Cache1.class);
- f4.setInterfaces(new Class[] { Cache2.class });
- Class c4 = f4.createClass();
- assertFalse(c == c4);
- ProxyFactory f5 = new ProxyFactory();
- f5.setSuperclass(Cache1.class);
- f5.setInterfaces(new Class[] { Cache2.class });
- assertEquals(c4, f5.createClass());
- ProxyFactory f6 = new ProxyFactory();
- f6.setInterfaces(new Class[] { Cache2.class });
- assertFalse(c4 == f6.createClass());
- ProxyFactory.useCache = prev;
- }
-
- public static class Cache1 {
- public int foo() { return 0; }
- }
-
- public static interface Cache2 {
- public int bar();
- }
-
- public void testReadWrite() throws Exception {
- final String fileName = "read-write.bin";
- ProxyFactory.ClassLoaderProvider cp = ProxyFactory.classLoaderProvider;
- ProxyFactory.classLoaderProvider = new ProxyFactory.ClassLoaderProvider() {
- public ClassLoader get(ProxyFactory pf) {
- return new javassist.Loader();
- }
- };
- ProxyFactory pf = new ProxyFactory();
- pf.setSuperclass(ReadWriteData.class);
- Object data = pf.createClass().getConstructor().newInstance();
- // Object data = new ReadWriteData();
- ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName));
- oos.writeObject(data);
- oos.close();
- ProxyFactory.classLoaderProvider = cp;
-
- ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName));
- Object data2 = ois.readObject();
- ois.close();
- int i = ((ReadWriteData)data2).foo();
- assertEquals(4, i);
- }
-
- public static class ReadWriteData implements Serializable {
- public int foo() { return 4; }
- }
-
- public void testWriteReplace() throws Exception {
- ProxyFactory pf = new ProxyFactory();
- pf.setSuperclass(WriteReplace.class);
- Object data = pf.createClass().getConstructor().newInstance();
- assertEquals(data, ((WriteReplace)data).writeReplace());
-
- ProxyFactory pf2 = new ProxyFactory();
- pf2.setSuperclass(WriteReplace2.class);
- Object data2 = pf2.createClass().getConstructor().newInstance();
- Method meth = data2.getClass().getDeclaredMethod("writeReplace", new Class[0]);
- assertEquals("javassist.util.proxy.SerializedProxy",
- meth.invoke(data2, new Object[0]).getClass().getName());
- }
-
- public static class WriteReplace implements Serializable {
- public Object writeReplace() { return this; }
- }
-
- public static class WriteReplace2 implements Serializable {
- public Object writeReplace(int i) { return Integer.valueOf(i); }
- }
-
- public static void testJIRA189() throws Exception {
- Class persistentClass = Target189.PublishedArticle.class;
- ProxyFactory factory = new ProxyFactory();
- // factory.writeDirectory = ".";
- factory.setUseCache(false);
- factory.setSuperclass(persistentClass);
- factory.setInterfaces(new Class[] { Target189.TestProxy.class });
- Class cl = factory.createClass();
- Target189.TestProxy proxy = (Target189.TestProxy)cl.getConstructor().newInstance();
- Target189.TestMethodHandler methodHandler = new Target189.TestMethodHandler();
- ((ProxyObject)proxy).setHandler(methodHandler);
- ((Target189.Article)proxy).getIssue();
- assertTrue(methodHandler.wasInvokedOnce());
- methodHandler.reset();
- Target189.PublishedArticle article = (Target189.PublishedArticle)proxy;
- article.getIssue();
- assertTrue(methodHandler.wasInvokedOnce());
- }
-
- public void testJIRA127() throws Exception {
- ProxyFactory proxyFactory = new ProxyFactory();
- // proxyFactory.writeDirectory = ".";
- proxyFactory.setInterfaces(new Class[]{ Target127.Sub.class });
- Target127.Sub proxy = (Target127.Sub)proxyFactory.create(new Class[0], new Object[0], new MethodHandler() {
- public Object invoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable {
- return null;
- }
- });
- ((Target127.Super)proxy).item(); // proxyFactory must generate a bridge method.
- ((Target127.Sub)proxy).item();
- }
-
- public static void main(String[] args) {
- // javassist.bytecode.ClassFile.MAJOR_VERSION = javassist.bytecode.ClassFile.JAVA_6;
- junit.textui.TestRunner.run(ProxyTester.class);
- }
-}
+package testproxy; + +import java.lang.reflect.Method; +import java.lang.reflect.Constructor; +import java.lang.reflect.Modifier; +import java.lang.reflect.InvocationTargetException; +import javassist.util.proxy.ProxyFactory; +import javassist.util.proxy.MethodFilter; +import javassist.util.proxy.MethodHandler; +import javassist.util.proxy.ProxyObject; +import javassist.util.proxy.Proxy; +import junit.framework.Assert; +import junit.framework.TestCase; +import java.io.*; + +public class ProxyTester extends TestCase { + public ProxyTester(String s) { + super(s); + } + + public ProxyTester() { + this("proxy"); + } + + static class Interceptor1 implements MethodHandler { + int counter = 0; + + public Object invoke(Object self, Method m, Method proceed, + Object[] args) throws Exception { + System.out.println("intercept: " + m + ", proceed: " + proceed); + System.out.println(" modifier: " + + Modifier.toString(proceed.getModifiers())); + counter++; + return proceed.invoke(self, args); + } + } + + static class Interceptor2 implements MethodHandler { + int counter = 0; + public Object invoke(Object self, Method m, Method proceed, + Object[] args) throws Exception { + System.out.println("intercept: " + m + ", proceed: " + proceed); + counter++; + if (proceed != null) + return proceed.invoke(self, args); + else + if (m.getReturnType() == int.class) + return Integer.valueOf(3); + else + return "OK"; + } + } + + static MethodFilter finalizeRemover = new MethodFilter() { + public boolean isHandled(Method m) { + return !m.getName().equals("finalize"); + } + }; + + public void testTarget() throws Exception { + ProxyFactory f = new ProxyFactory(); + f.setSuperclass(Target.class); + Interceptor1 interceptor = new Interceptor1(); + // f.setHandler(interceptor); + f.setFilter(finalizeRemover); + f.writeDirectory = "."; + Class c = f.createClass(); + Target obj = (Target)c.getConstructor().newInstance(); + ((Proxy)obj).setHandler(interceptor); + obj.m(); + assertEquals(true, obj.m(true)); + assertEquals((byte)1, obj.m1((byte)1)); + assertEquals('a', obj.m2('a')); + assertEquals((short)2, obj.m3((short)2)); + assertEquals(3, obj.m(3)); + assertEquals(4L, obj.m5(4L)); + assertTrue(5.0F == obj.m6(5.0F)); + assertTrue(6.0 == obj.m7(6.0)); + assertEquals("test", obj.m("test")); + int[] ia = { 1, 2, 3 }; + assertEquals(ia, obj.m7(ia)); + String[] sa = { "1", "2" }; + assertEquals(sa, obj.m8(sa)); + assertEquals(obj, obj.m9(3, obj, null)); + assertEquals(14, interceptor.counter); + } + + public void testTarget1() throws Exception { + ProxyFactory f = new ProxyFactory(); + f.setSuperclass(Target1.class); + Interceptor1 interceptor = new Interceptor1(); + // f.setHandler(interceptor); + f.setFilter(finalizeRemover); + Class c = f.createClass(); + Target1 obj = (Target1)c.getConstructor().newInstance(); + ((Proxy)obj).setHandler(interceptor); + assertEquals(null, obj.m(null)); + assertEquals(1, interceptor.counter); + } + + public void testObject() throws Exception { + ProxyFactory f = new ProxyFactory(); + Interceptor1 interceptor = new Interceptor1(); + // f.setHandler(interceptor); + f.setFilter(finalizeRemover); + Class c = f.createClass(); + Object obj = (Object)c.getConstructor().newInstance(); + ((Proxy)obj).setHandler(interceptor); + System.out.println(obj.toString()); + assertEquals(2, interceptor.counter); + } + + public void testSetter() throws Exception { + ProxyFactory f = new ProxyFactory(); + f.writeDirectory = "."; + Interceptor1 interceptor = new Interceptor1(); + // f.setHandler(interceptor); + f.setFilter(finalizeRemover); + Class c = f.createClass(); + Object obj = (Object)c.getConstructor().newInstance(); + ((Proxy)obj).setHandler(interceptor); + System.out.println("setter1: " + obj.toString()); + ((ProxyObject)obj).setHandler(new MethodHandler() { + public Object invoke(Object self, Method m, Method proceed, + Object[] args) throws Exception { + System.out.print("intercept: " + m); + return "OK"; + } + }); + assertEquals("OK", obj.toString()); + } + + public void testString() throws Exception { + ProxyFactory f = new ProxyFactory(); + Interceptor1 interceptor = new Interceptor1(); + // f.setHandler(interceptor); + f.setFilter(finalizeRemover); + f.setSuperclass(String.class); + try { + Class c = f.createClass(); + Assert.fail("String is final!"); + } + catch (RuntimeException e) { + System.out.println(e); + } + } + + public void testConstructor() throws Exception { + ProxyFactory f = new ProxyFactory(); + Interceptor1 interceptor = new Interceptor1(); + // f.setHandler(interceptor); + f.setFilter(finalizeRemover); + f.setSuperclass(Target2.class); + Class c = f.createClass(); + Constructor[] cons = c.getDeclaredConstructors(); + assertEquals(3, cons.length); + Constructor con1 = c.getDeclaredConstructor(new Class[] { int.class }); + Constructor con2 = c.getDeclaredConstructor(new Class[] { int.class, int.class }); + Method m1 = c.getDeclaredMethod("get", new Class[0]); + Method m2 = c.getDeclaredMethod("foo", new Class[0]); + assertEquals(0, m1.getExceptionTypes().length); + assertEquals("java.io.IOException", m2.getExceptionTypes()[0].getName()); + + Target2 t2 = (Target2)con1.newInstance(new Object[] { Integer.valueOf(1) }); + ((Proxy)t2).setHandler(interceptor); + System.out.println(t2.toString()); + assertEquals(2, interceptor.counter); + + interceptor.counter = 0; + assertEquals(2, t2.foo()); + assertEquals(4, t2._dfoo()); + assertEquals(2, interceptor.counter); + } + + public void testInterface() throws Exception { + ProxyFactory f = new ProxyFactory(); + Interceptor2 interceptor2 = new Interceptor2(); + // f.setHandler(interceptor2); + f.setFilter(finalizeRemover); + f.setInterfaces(new Class[] { Target3.class }); + Class c = f.createClass(); + Target3 obj = (Target3)c.getConstructor().newInstance(); + ((Proxy)obj).setHandler(interceptor2); + assertEquals("OK", obj.m()); + System.out.println(obj.toString()); + assertEquals(3, interceptor2.counter); + } + + public void test2Interfaces() throws Exception { + ProxyFactory f = new ProxyFactory(); + Interceptor2 interceptor2 = new Interceptor2(); + // f.setHandler(interceptor2); + f.setFilter(finalizeRemover); + f.setInterfaces(new Class[] { Target3.class, Target4.class }); + Class c = f.createClass(); + Target3 obj = (Target3)c.getConstructor().newInstance(); + ((Proxy)obj).setHandler(interceptor2); + assertEquals("OK", obj.m()); + System.out.println(obj.toString()); + assertEquals(3, interceptor2.counter); + + interceptor2.counter = 0; + Target4 obj4 = (Target4)c.getConstructor().newInstance(); + ((Proxy)obj4).setHandler(interceptor2); + assertEquals(3, obj4.bar4()); + assertEquals(3, obj4.foo4()); + assertEquals(2, interceptor2.counter); + } + + public void testFilter() throws Exception { + ProxyFactory f = new ProxyFactory(); + Interceptor2 interceptor2 = new Interceptor2(); + // f.setHandler(interceptor2); + f.setFilter(finalizeRemover); + f.setInterfaces(new Class[] { Target3.class }); + f.setFilter(new MethodFilter() { + public boolean isHandled(Method m) { + return m.getDeclaringClass() != Object.class; + } + }); + Class c = f.createClass(); + Target3 obj = (Target3)c.getConstructor().newInstance(); + ((Proxy)obj).setHandler(interceptor2); + assertEquals("OK", obj.m()); + System.out.println(obj.toString()); + assertEquals(1, interceptor2.counter); + } + + public static boolean testInitFlag; + + public void testInit() throws Exception { + ProxyFactory f = new ProxyFactory(); + f.setSuperclass(TargetInit.class); + MethodHandler handler = new MethodHandler() { + public Object invoke(Object self, Method m, + Method proceed, Object[] args) throws Exception { + System.out.println("testInit " + testInitFlag); + return proceed.invoke(self, args); + } + }; + testInitFlag = false; + Class c = f.createClass(); + assertTrue(testInitFlag); // since 3.12. Before then, this line was assertFalse(testInitFlag); + System.out.println("testInit createClass(): " + testInitFlag); + TargetInit obj = (TargetInit)c.getConstructor().newInstance(); + assertTrue(testInitFlag); + System.out.println("testInit newInstance(): " + testInitFlag); + ((ProxyObject)obj).setHandler(handler); + assertEquals("OK", obj.m()); + } + + public void testCreate() throws Exception { + ProxyFactory f = new ProxyFactory(); + f.setSuperclass(Target5.class); + Interceptor1 interceptor = new Interceptor1(); + // f.setHandler(interceptor); + f.setFilter(finalizeRemover); + Class c = f.createClass(); + Target5 obj = (Target5)f.create(new Class[] { int.class }, new Object[] { Integer.valueOf(3) }); + ((Proxy)obj).setHandler(interceptor); + assertEquals(3, obj.get()); + } + + + public void testBridgeMethod() throws Exception { + ProxyFactory f = new ProxyFactory(); + f.writeDirectory = "."; + f.setSuperclass(BridgeMethod.class); + Interceptor1 interceptor = new Interceptor1(); + // f.setHandler(interceptor); + f.setFilter(finalizeRemover); + Class c = f.createClass(); + BridgeMethod obj = (BridgeMethod)c.getConstructor().newInstance(); + ((Proxy)obj).setHandler(interceptor); + Integer value = obj.m1(); + assertEquals(7, value.intValue()); + BridgeMethodInf inf = (BridgeMethodInf)obj; + Number num = inf.m1(); + assertEquals(7, num.intValue()); + BridgeMethodSuper sup = obj; + try { + Object x = sup.id(new Object()); + fail("not cast error"); + } + catch (ClassCastException e) {} + catch (Exception e) { + if (e instanceof InvocationTargetException) + if (e.getCause() instanceof ClassCastException) + return; + + throw e; + } + } + + public void testGetters() throws Exception { + ProxyFactory f = new ProxyFactory(); + Class c = ProxyTester.class; + f.setSuperclass(c); + assertEquals(c, f.getSuperclass()); + Class i = java.io.Serializable.class; + f.setInterfaces(new Class[] { i }); + assertEquals(i, f.getInterfaces()[0]); + } + + static class ProxyFactory2 extends ProxyFactory { + public ClassLoader getClassLoader2() { + return getClassLoader(); + } + } + + public void testProvider() throws Exception { + ProxyFactory.ClassLoaderProvider cp = ProxyFactory.classLoaderProvider; + try { + final ClassLoader cl = Thread.currentThread().getContextClassLoader(); + ProxyFactory.classLoaderProvider = new ProxyFactory.ClassLoaderProvider() { + public ClassLoader get(ProxyFactory pf) { + return Thread.currentThread().getContextClassLoader(); + } + }; + + ProxyFactory2 pf = new ProxyFactory2(); + assertEquals(cl, pf.getClassLoader2()); + } + finally { + ProxyFactory.classLoaderProvider = cp; + } + } + + @SuppressWarnings("deprecation") + public void testCache() throws Exception { + boolean prev = ProxyFactory.useCache; + ProxyFactory.useCache = true; + ProxyFactory f = new ProxyFactory(); + f.setSuperclass(Cache1.class); + Class c = f.createClass(); + ProxyFactory f2 = new ProxyFactory(); + f2.setSuperclass(Cache1.class); + assertEquals(c, f2.createClass()); + ProxyFactory f3 = new ProxyFactory(); + f3.setSuperclass(Cache1.class); + f3.setHandler(new Interceptor1()); // deprecated + assertFalse(c == f3.createClass()); + ProxyFactory.useCache = true; + ProxyFactory f4 = new ProxyFactory(); + f4.setSuperclass(Cache1.class); + f4.setInterfaces(new Class[] { Cache2.class }); + Class c4 = f4.createClass(); + assertFalse(c == c4); + ProxyFactory f5 = new ProxyFactory(); + f5.setSuperclass(Cache1.class); + f5.setInterfaces(new Class[] { Cache2.class }); + assertEquals(c4, f5.createClass()); + ProxyFactory f6 = new ProxyFactory(); + f6.setInterfaces(new Class[] { Cache2.class }); + assertFalse(c4 == f6.createClass()); + ProxyFactory.useCache = prev; + } + + public static class Cache1 { + public int foo() { return 0; } + } + + public static interface Cache2 { + public int bar(); + } + + public void testReadWrite() throws Exception { + final String fileName = "read-write.bin"; + ProxyFactory.ClassLoaderProvider cp = ProxyFactory.classLoaderProvider; + try { + ProxyFactory.classLoaderProvider = new ProxyFactory.ClassLoaderProvider() { + public ClassLoader get(ProxyFactory pf) { + /* If javassist.Loader is returned, the super type of ReadWriteData class, + * which is Serializable, is loaded by javassist.Loader as well as ReadWriteData. + * This breaks the implementation of the object serializer. + */ + // return new javassist.Loader(); + return Thread.currentThread().getContextClassLoader(); + } + }; + ProxyFactory pf = new ProxyFactory(); + pf.setSuperclass(ReadWriteData.class); + Object data = pf.createClass().getConstructor().newInstance(); + //Object data = new ReadWriteData(); + ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName)); + oos.writeObject(data); + oos.close(); + } + finally { + ProxyFactory.classLoaderProvider = cp; + } + + ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName)); + Object data2 = ois.readObject(); + ois.close(); + int i = ((ReadWriteData)data2).foo(); + assertEquals(4, i); + } + + public static class ReadWriteData implements Serializable { + public int foo() { return 4; } + } + + public void testWriteReplace() throws Exception { + ProxyFactory pf = new ProxyFactory(); + pf.setSuperclass(WriteReplace.class); + Object data = pf.createClass().getConstructor().newInstance(); + assertEquals(data, ((WriteReplace)data).writeReplace()); + + ProxyFactory pf2 = new ProxyFactory(); + pf2.setSuperclass(WriteReplace2.class); + Object data2 = pf2.createClass().getConstructor().newInstance(); + Method meth = data2.getClass().getDeclaredMethod("writeReplace", new Class[0]); + assertEquals("javassist.util.proxy.SerializedProxy", + meth.invoke(data2, new Object[0]).getClass().getName()); + } + + public static class WriteReplace implements Serializable { + public Object writeReplace() { return this; } + } + + public static class WriteReplace2 implements Serializable { + public Object writeReplace(int i) { return Integer.valueOf(i); } + } + + public static void testJIRA189() throws Exception { + Class persistentClass = Target189.PublishedArticle.class; + ProxyFactory factory = new ProxyFactory(); + //factory.writeDirectory = "."; + factory.setUseCache(false); + factory.setSuperclass(persistentClass); + factory.setInterfaces(new Class[] { Target189.TestProxy.class }); + Class cl = factory.createClass(); + Object obj = cl.getConstructor().newInstance(); + System.out.println("JIRA189:" + obj.getClass().getClassLoader() + ", " + obj.getClass().getSuperclass().getName() + + ", " + Target189.PublishedArticle.class.getClassLoader()); + Target189.TestProxy proxy = (Target189.TestProxy)cl.getConstructor().newInstance(); + Target189.TestMethodHandler methodHandler = new Target189.TestMethodHandler(); + ((ProxyObject)proxy).setHandler(methodHandler); + ((Target189.Article)proxy).getIssue(); + assertTrue(methodHandler.wasInvokedOnce()); + methodHandler.reset(); + Target189.PublishedArticle article = (Target189.PublishedArticle)proxy; + article.getIssue(); + assertTrue(methodHandler.wasInvokedOnce()); + } + + public void testJIRA127() throws Exception { + ProxyFactory proxyFactory = new ProxyFactory(); + // proxyFactory.writeDirectory = "."; + proxyFactory.setInterfaces(new Class[]{ Target127.Sub.class }); + Target127.Sub proxy = (Target127.Sub)proxyFactory.create(new Class[0], new Object[0], new MethodHandler() { + public Object invoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable { + return null; + } + }); + ((Target127.Super)proxy).item(); // proxyFactory must generate a bridge method. + ((Target127.Sub)proxy).item(); + } + + public static void main(String[] args) { + // javassist.bytecode.ClassFile.MAJOR_VERSION = javassist.bytecode.ClassFile.JAVA_6; + junit.textui.TestRunner.run(ProxyTester.class); + } +} |