Java である Bean を別の Bean にコピーしたいと思います。classloading-juggler フレームワーク内にあり、両方のクラスが現在のクラスローダーとは異なる別のクラスローダーによってロードされるという問題。
最も効率的な方法で行う必要があるため、リフレクションベースではなく、バイトコード生成ソリューション (cglib BeanCopier など) を使用するのが最善の方法です。
問題は、この場合 cglib BeanCopier が機能しないことです。それを示す最も簡単なコードは次のとおりです。
URL classesUrl = new File("/directory/with/class-files-for-Person").toURL();
Class<?> c1 = new URLClassLoader(new URL[] {classesUrl}).loadClass("Person");
Class<?> c2 = new URLClassLoader(new URL[] {classesUrl}).loadClass("Person");
Object o1 = c1.newInstance();
Object o2 = c2.newInstance();
BeanCopier copier = BeanCopier.create(o1.getClass(), o2.getClass(), false);
copier.copy(o1, o2, null);
それは例外を与えます:
Exception in thread "main" java.lang.ClassCastException: Person cannot be cast to Person
at net.sf.cglib.empty.Object$$BeanCopierByCGLIB$$da60538e.copy(<generated>)
at Main.main(Main.java:22)
私はそれを解決する方法を見つけています。私の場合、両方のクラスは同じですが、カスタム クラスローダーがロードされています。また、プロパティには java.* からの privimives とクラスのみが含まれます (したがって、これらは標準のクラスローダーによってロードされます)。