シリアライズを利用したディープコピーで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つ回避パターンが増えた。よかったよかった。