package ser; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.core.IsInstanceOf.instanceOf; import static org.junit.Assert.assertThat; import java.io.ByteArrayInputStream; import java.io.Serializable; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; import javassist.util.proxy.MethodHandler; import javassist.util.proxy.ProxyFactory; import javassist.util.proxy.ProxyObject; import org.junit.Test; import org.nustaq.serialization.FSTConfiguration; import org.nustaq.serialization.FSTObjectInput; public class FSTJavaAssistTest { static FSTConfiguration cfg = FSTConfiguration.createDefaultConfiguration(); static Class proxyClass; static { ProxyFactory factory = new ProxyFactory(); factory.setSuperclass(Target.class); factory.setInterfaces(new Class[] { Serializable.class, WriteReplace.class }); proxyClass = factory.createClass(); } @Test public void testProxyInArrayList() throws Exception { Collection list = Arrays.asList( newProxy(new Target("One")), newProxy(new Target("Two")), newProxy(new Target("Three"))); Collection result = thereAndBack(list); for (Object item : result) { System.out.println(item); assertThat(item, instanceOf(Target.class)); assertThat(((Target) item).text, notNullValue()); assertThat(((Target) item).text, instanceOf(String.class)); } } private Target newProxy(final Target target) throws Exception { MethodHandler handler = new MyHandler(target); Object instance = proxyClass.newInstance(); ((ProxyObject) instance).setHandler(handler); return (Target) instance; } public Collection thereAndBack(Collection data) throws Exception { byte[] buf = cfg.asByteArray(data); System.out.println(new String(buf)); FSTObjectInput objectInput = new FSTObjectInput(new ByteArrayInputStream(buf)); Collection list = (Collection) objectInput.readObject(); objectInput.close(); return list; } public static class MyHandler implements MethodHandler { private Target target; public MyHandler(Target target) { this.target = target; } public Target getTarget() { return target; } @Override public Object invoke(Object self, Method overridden, Method forwarder, Object[] args) throws Throwable { if ("writeReplace".equals(overridden.getName()) && args.length == 0) { return target; } return overridden.invoke(target, args); } } public static class Target implements Serializable { private static final long serialVersionUID = 1L; public String text; public Target() { } public Target(String text) { this.text = text; } @Override public String toString() { return text; } } public static interface WriteReplace { public Object writeReplace(); } }