X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=support%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fgeneral%2FThreadSpecificProxyFactory.java;h=e3b687df15777ac1fd07003c9d04ed272b925d66;hb=f6a4f6efd56cf78323bd3b6caef026e0dc25ac02;hp=5cf23cea73c0d30ad04b6df6b5e7841d266b51c9;hpb=5848627da8ebebff9b1a840f70d6f4292323b9b2;p=utils diff --git a/support/general/src/main/java/org/wamblee/general/ThreadSpecificProxyFactory.java b/support/general/src/main/java/org/wamblee/general/ThreadSpecificProxyFactory.java index 5cf23cea..e3b687df 100644 --- a/support/general/src/main/java/org/wamblee/general/ThreadSpecificProxyFactory.java +++ b/support/general/src/main/java/org/wamblee/general/ThreadSpecificProxyFactory.java @@ -16,8 +16,6 @@ package org.wamblee.general; import java.lang.reflect.InvocationHandler; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** @@ -33,7 +31,11 @@ import java.lang.reflect.Proxy; * instance. The result from this method can be passed at construction of an object that will be used * by multiple threads. * - * This class is mostly used by other test tools. + * This class is mostly used by infrastructure code (utilities) and test tools. + * + * Care has been taken so that the invocation handler is serializable. + * However, it is only serializable within one virtual machine. It cannot be used in a distributed context + * where it can be sent to another JVM. * * @param T * Interface to proxy. @@ -41,19 +43,8 @@ import java.lang.reflect.Proxy; * */ public class ThreadSpecificProxyFactory { - private class ThreadSpecificInvocationHandler implements InvocationHandler { - - @Override - public Object invoke(Object aProxy, Method aMethod, Object[] aArgs) - throws Throwable { - try { - return aMethod.invoke(svc.get(), aArgs); - } catch (InvocationTargetException e) { - throw e.getCause(); - } - } - } - + + private ThreadLocal svc; private Class clazz; private T proxy; @@ -72,6 +63,7 @@ public class ThreadSpecificProxyFactory { svc = new ThreadLocal(); clazz = aClass; proxy = createProxy(); + } /** @@ -105,7 +97,7 @@ public class ThreadSpecificProxyFactory { } private T createProxy() { - InvocationHandler handler = new ThreadSpecificInvocationHandler(); + InvocationHandler handler = new ThreadSpecificInvocationHandler(svc, clazz); Class proxyClass = Proxy.getProxyClass(clazz.getClassLoader(), new Class[] { clazz }); T proxyObj;