シリアライズを利用したディープコピーでClassLoaderを指定

ってできるみたい。。。

http://blog.livedoor.jp/lalha_java/archives/50302218.html

に載ってた。
真似させてもらって

public class ClassLoaderSpecifiedObjectInputStream extends ObjectInputStream {

    private final ClassLoader loader;

    public ClassLoaderSpecifiedObjectInputStream(InputStream in, ClassLoader loader) throws IOException {
        super(in);
        this.loader = loader;
    }

    public Class resolveClass(ObjectStreamClass v) throws IOException, ClassNotFoundException {
        if (this.loader == null) {
            return super.resolveClass(v);
        }
        return Class.forName(v.getName(), false, this.loader);
    }

}
public class CopyUtil {

    public static Object deepCopy(Serializable obj, ClassLoader loader) throws IORuntimeException,
            ClassNotFoundRuntimeException {
        if (obj == null) {
            return null;
        }
        try {
            ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(byteOut);
            out.writeObject(obj);
            ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
            ClassLoaderSpecifiedObjectInputStream in = new ClassLoaderSpecifiedObjectInputStream(byteIn, loader);
            return in.readObject();
        } catch (IOException ex) {
            throw new IORuntimeException(ex);
        } catch (ClassNotFoundException ex) {
            throw new ClassNotFoundRuntimeException(ex);
        }
    }

}

で試したらできた。
また1つ回避パターンが増えた。よかったよかった。