From a904f21c6dead5d668205119241bc4206d70d064 Mon Sep 17 00:00:00 2001 From: chiba Date: Thu, 25 Oct 2012 16:38:40 +0000 Subject: [PATCH] fixed JASSIST-163. Eager initialization has been implemented. git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@676 30ef5769-5b8d-40dd-aea6-55b5d6557bb3 --- javassist.jar | Bin 699781 -> 700680 bytes .../javassist/util/proxy/MethodHandler.java | 4 +- .../javassist/util/proxy/ProxyFactory.java | 112 ++++++++++++------ .../javassist/util/proxy/RuntimeSupport.java | 34 ++---- src/test/javassist/JvstTest.java | 4 +- .../proxyfactory/ProxyFactoryTest.java | 2 - .../test/javassist/proxy/ProxySimpleTest.java | 38 ++++++ 7 files changed, 128 insertions(+), 66 deletions(-) diff --git a/javassist.jar b/javassist.jar index 87393d38453b9dc977ec832f6d9e3943b6fc073f..6cd27e1cfd46781f4fd5e9e0d9c3edfcaabd72a2 100644 GIT binary patch delta 27908 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

>#3-t%` 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 H>Yex>waR~C delta 27031 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", "()V"); minfo.setAccessFlags(AccessFlag.STATIC); - Bytecode code = new Bytecode(cp, 0, 0); + setThrows(minfo, cp, new Class[] { ClassNotFoundException.class }); + + Bytecode code = new Bytecode(cp, 0, 2); code.addIconst(size * 2); code.addAnewarray("java.lang.reflect.Method"); + final int varArray = 0; + code.addAstore(varArray); + + // forName() must be called here. Otherwise, the class might be + // invisible. + code.addLdc(classname); + code.addInvokestatic("java.lang.Class", + "forName", "(Ljava/lang/String;)Ljava/lang/Class;"); + final int varClass = 1; + code.addAstore(varClass); + + Iterator it = forwarders.iterator(); + while (it.hasNext()) { + Find2MethodsArgs args = (Find2MethodsArgs)it.next(); + callFind2Methods(code, args.methodName, args.delegatorName, + args.origIndex, args.descriptor, varClass, varArray); + } + + code.addAload(varArray); code.addPutstatic(classname, HOLDER, HOLDER_TYPE); - // also need to set serial version uid - code.addLconst(-1L); + + code.addLconst(SERIAL_VERSION_UID_VALUE); code.addPutstatic(classname, SERIAL_VERSION_UID_FIELD, SERIAL_VERSION_UID_TYPE); code.addOpcode(Bytecode.RETURN); minfo.setCodeAttribute(code.toCodeAttribute()); cf.addMethod(minfo); } + /** + * @param thisMethod might be null. + */ + private static void callFind2Methods(Bytecode code, String superMethod, String thisMethod, + int index, String desc, int classVar, int arrayVar) { + String findClass = RuntimeSupport.class.getName(); + String findDesc + = "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/reflect/Method;)V"; + + code.addAload(classVar); + code.addLdc(superMethod); + if (thisMethod == null) + code.addOpcode(Opcode.ACONST_NULL); + else + code.addLdc(thisMethod); + + code.addIconst(index); + code.addLdc(desc); + code.addAload(arrayVar); + code.addInvokestatic(findClass, "find2Methods", findDesc); + } + private static void addSetter(String classname, ClassFile cf, ConstPool cp) throws CannotCompileException { @@ -925,7 +971,7 @@ public class ProxyFactory { cf.addMethod(minfo); } - private int overrideMethods(ClassFile cf, ConstPool cp, String className) + private int overrideMethods(ClassFile cf, ConstPool cp, String className, ArrayList forwarders) throws CannotCompileException { String prefix = makeUniqueName("_d", signatureMethods); @@ -938,7 +984,7 @@ public class ProxyFactory { int mod = meth.getModifiers(); if (testBit(signature, index)) { override(className, meth, prefix, index, - keyToDesc(key, meth), cf, cp); + keyToDesc(key, meth), cf, cp, forwarders); } index++; } @@ -947,7 +993,7 @@ public class ProxyFactory { } private void override(String thisClassname, Method meth, String prefix, - int index, String desc, ClassFile cf, ConstPool cp) + int index, String desc, ClassFile cf, ConstPool cp, ArrayList forwarders) throws CannotCompileException { Class declClass = meth.getDeclaringClass(); @@ -964,7 +1010,7 @@ public class ProxyFactory { MethodInfo forwarder = makeForwarder(thisClassname, meth, desc, cp, declClass, - delegatorName, index); + delegatorName, index, forwarders); cf.addMethod(forwarder); } @@ -1154,7 +1200,8 @@ public class ProxyFactory { */ private static MethodInfo makeForwarder(String thisClassName, Method meth, String desc, ConstPool cp, - Class declClass, String delegatorName, int index) { + Class declClass, String delegatorName, int index, + ArrayList forwarders) { MethodInfo forwarder = new MethodInfo(cp, meth.getName(), desc); forwarder.setAccessFlags(Modifier.FINAL | (meth.getModifiers() & ~(Modifier.ABSTRACT @@ -1164,13 +1211,14 @@ public class ProxyFactory { int args = Descriptor.paramSize(desc); Bytecode code = new Bytecode(cp, 0, args + 2); /* - * if (methods[index * 2] == null) { + * static { * methods[index * 2] * = RuntimeSupport.findSuperMethod(this, , ); * methods[index * 2 + 1] * = RuntimeSupport.findMethod(this, , ); * or = null // the original method is abstract. * } + * : * return ($r)handler.invoke(this, methods[index * 2], * methods[index * 2 + 1], $args); */ @@ -1180,7 +1228,7 @@ public class ProxyFactory { code.addGetstatic(thisClassName, HOLDER, HOLDER_TYPE); code.addAstore(arrayVar); - callFind2Methods(code, meth.getName(), delegatorName, origIndex, desc, arrayVar); + forwarders.add(new Find2MethodsArgs(meth.getName(), delegatorName, desc, origIndex)); code.addAload(0); code.addGetfield(thisClassName, HANDLER, HANDLER_TYPE); @@ -1207,6 +1255,18 @@ public class ProxyFactory { return forwarder; } + static class Find2MethodsArgs { + String methodName, delegatorName, descriptor; + int origIndex; + + Find2MethodsArgs(String mname, String dname, String desc, int index) { + methodName = mname; + delegatorName = dname; + descriptor = desc; + origIndex = index; + } + } + private static void setThrows(MethodInfo minfo, ConstPool cp, Method orig) { Class[] exceptions = orig.getExceptionTypes(); setThrows(minfo, cp, exceptions); @@ -1313,28 +1373,6 @@ public class ProxyFactory { return regno + FactoryHelper.dataSize[index]; } - /** - * @param thisMethod might be null. - */ - private static void callFind2Methods(Bytecode code, String superMethod, String thisMethod, - int index, String desc, int arrayVar) { - String findClass = RuntimeSupport.class.getName(); - String findDesc - = "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/reflect/Method;)V"; - - code.addAload(0); - code.addLdc(superMethod); - if (thisMethod == null) - code.addOpcode(Opcode.ACONST_NULL); - else - code.addLdc(thisMethod); - - code.addIconst(index); - code.addLdc(desc); - code.addAload(arrayVar); - code.addInvokestatic(findClass, "find2Methods", findDesc); - } - private static void addUnwrapper(Bytecode code, Class type) { if (type.isPrimitive()) { if (type == Void.TYPE) diff --git a/src/main/javassist/util/proxy/RuntimeSupport.java b/src/main/javassist/util/proxy/RuntimeSupport.java index 48cacecd..4c5d8996 100644 --- a/src/main/javassist/util/proxy/RuntimeSupport.java +++ b/src/main/javassist/util/proxy/RuntimeSupport.java @@ -46,24 +46,13 @@ public class RuntimeSupport { * @throws RuntimeException if the methods are not found. * @see javassist.util.proxy.ProxyFactory */ - public static void find2Methods(Object self, String superMethod, + public static void find2Methods(Class clazz, String superMethod, String thisMethod, int index, String desc, java.lang.reflect.Method[] methods) { - /* Once methods[index] and methods[index + 1] are set to non-null, - * then their values never change. - */ - if (methods[index] == null || methods[index + 1] == null) { - Method m1 = thisMethod == null ? null - : findMethod(self, thisMethod, desc); - Method m0 = findSuperMethod(self, superMethod, desc); - synchronized (methods) { - if (methods[index] == null) { - methods[index + 1] = m1; - methods[index] = m0; - } - } - } + methods[index + 1] = thisMethod == null ? null + : findMethod(clazz, thisMethod, desc); + methods[index] = findSuperMethod(clazz, superMethod, desc); } /** @@ -72,10 +61,10 @@ public class RuntimeSupport { * * @throws RuntimeException if the method is not found. */ - public static Method findMethod(Object self, String name, String desc) { - Method m = findMethod2(self.getClass(), name, desc); + public static Method findMethod(Class clazz, String name, String desc) { + Method m = findMethod2(clazz, name, desc); if (m == null) - error(self, name, desc); + error(clazz, name, desc); return m; } @@ -86,21 +75,20 @@ public class RuntimeSupport { * * @throws RuntimeException if the method is not found. */ - public static Method findSuperMethod(Object self, String name, String desc) { - Class clazz = self.getClass(); + public static Method findSuperMethod(Class clazz, String name, String desc) { Method m = findSuperMethod2(clazz.getSuperclass(), name, desc); if (m == null) m = searchInterfaces(clazz, name, desc); if (m == null) - error(self, name, desc); + error(clazz, name, desc); return m; } - private static void error(Object self, String name, String desc) { + private static void error(Class clazz, String name, String desc) { throw new RuntimeException("not found " + name + ":" + desc - + " in " + self.getClass().getName()); + + " in " + clazz.getName()); } private static Method findSuperMethod2(Class clazz, String name, String desc) { diff --git a/src/test/javassist/JvstTest.java b/src/test/javassist/JvstTest.java index 4e22dbc1..596d62e2 100644 --- a/src/test/javassist/JvstTest.java +++ b/src/test/javassist/JvstTest.java @@ -1116,14 +1116,14 @@ public class JvstTest extends JvstTestRoot { suite.addTestSuite(javassist.bytecode.InsertGap0.class); suite.addTestSuite(javassist.tools.reflect.LoaderTest.class); suite.addTestSuite(testproxy.ProxyTester.class); - // suite.addTestSuite(testproxy.ProxyFactoryPerformanceTest.class); + suite.addTestSuite(testproxy.ProxyFactoryPerformanceTest.class); // remove? suite.addTestSuite(javassist.proxyfactory.ProxyFactoryTest.class); suite.addTestSuite(javassist.proxyfactory.Tester.class); suite.addTestSuite(test.javassist.proxy.ProxySerializationTest.class); suite.addTestSuite(test.javassist.convert.ArrayAccessReplaceTest.class); suite.addTestSuite(test.javassist.proxy.JASSIST113RegressionTest.class); suite.addTestSuite(test.javassist.proxy.JBPAPP9257Test.class); - //suite.addTestSuite(test.javassist.proxy.ProxyCacheGCTest.class); + suite.addTestSuite(test.javassist.proxy.ProxyCacheGCTest.class); // remvoe? suite.addTestSuite(test.javassist.proxy.ProxyFactoryCompatibilityTest.class); suite.addTestSuite(test.javassist.proxy.ProxySerializationTest.class); suite.addTestSuite(test.javassist.proxy.ProxySimpleTest.class); diff --git a/src/test/javassist/proxyfactory/ProxyFactoryTest.java b/src/test/javassist/proxyfactory/ProxyFactoryTest.java index 7224eb50..232a0165 100644 --- a/src/test/javassist/proxyfactory/ProxyFactoryTest.java +++ b/src/test/javassist/proxyfactory/ProxyFactoryTest.java @@ -12,8 +12,6 @@ import java.lang.reflect.Method; * Mark Struberg */ public class ProxyFactoryTest extends TestCase { - - public void testMethodHandlers() throws Exception { ProxyFactory fact = new ProxyFactory(); fact.setSuperclass(MyCls.class); diff --git a/src/test/test/javassist/proxy/ProxySimpleTest.java b/src/test/test/javassist/proxy/ProxySimpleTest.java index f74fce45..cab62397 100644 --- a/src/test/test/javassist/proxy/ProxySimpleTest.java +++ b/src/test/test/javassist/proxy/ProxySimpleTest.java @@ -9,9 +9,47 @@ import java.io.ObjectOutputStream; import java.io.Serializable; import java.lang.reflect.Method; +import javassist.util.proxy.MethodFilter; +import javassist.util.proxy.MethodHandler; +import javassist.util.proxy.Proxy; import javassist.util.proxy.ProxyFactory; public class ProxySimpleTest extends TestCase { + + String testResult; + + public void testProxyFactory() throws Exception { + ProxyFactory f = new ProxyFactory(); + f.writeDirectory = "./proxy"; + f.setSuperclass(Foo.class); + f.setFilter(new MethodFilter() { + public boolean isHandled(Method m) { + return m.getName().startsWith("f"); + } + }); + Class c = f.createClass(); + MethodHandler mi = new MethodHandler() { + public Object invoke(Object self, Method m, Method proceed, + Object[] args) throws Throwable { + testResult += args[0].toString(); + return proceed.invoke(self, args); // execute the original method. + } + }; + Foo foo = (Foo)c.newInstance(); + ((Proxy)foo).setHandler(mi); + testResult = ""; + foo.foo(1); + foo.foo2(2); + foo.bar(3); + assertEquals("12", testResult); + } + + public static class Foo { + public int foo(int i) { return i + 1; } + public int foo2(int i) { return i + 2; } + public int bar(int i) { return i + 1; } + } + public void testReadWrite() throws Exception { final String fileName = "read-write.bin"; ProxyFactory.ClassLoaderProvider cp = ProxyFactory.classLoaderProvider; -- 2.39.5