将java对象/类从一个类加载器复制到另一个类加载器

您有没有办法将一个类加载的上下文(atrributes等)从一个类加载器(例如’make’class Point)复制到另一个类加载器?

说清楚,示例:我在CL 1上有一个对象Point。现在在另一个CL2上运行,我想在CL 3中创建这个对象。

一些obj:

class Point { int x; int y; public Point() {} //getters and setters 

风景:

 ... class CL2 { // Running on CL 2 ... // Point obj from CL 1 Object point = gotFromCL1(); // Want to create the object on Cl2 Object pointCL2 = point.conversion(); 

但我不能使用sun.reflection(不可用),并且序列化不起作用,因为CL2使用CL 1自动“重建”对象。

我考虑的一个解决方案是做一个“100%”javareflectionrconstruct,基本上从CL2获取对象的字段并设置新的obj。

PS:它需要在Java 1.4.2上运行:’(

如果需要执行以下操作之一,请参阅Transloader ,了解如何在ClassLoader之间复制类:

  • 从几个ClassLoader到另一个ClassLoader 克隆几乎任何对象图

  • 从外部ClassLoader获取任何对象并在其上调用任何方法而不克隆它

我相信他有相同的类(具有相同的名称),但由两个类加载器加载和定义。 最好的办法是修复系统,以便不加载类和两次。

如果类在您的情况下就像您描述的那样简单,那么您可以查看XMLEncoder 。 使用它有很大的限制,但在简单的情况下它应该完成工作。

编辑:鉴于此限制,我会说将数据放在Map中并使用它。 您甚至可以让这两个类在内部将它们的状态存储在Map中,以便移动非常流畅。

如果这不起作用,那么看起来您正面临着自己的XML / JSON或纯CSV,这取决于数据的复杂性。

PowerMock类加载也提供类似于TransLoader的东西,它支持更多高级用例,例如(某些)reflection。 您可以轻松执行Runnable或Callable:

 ClassloaderExecutor cle = new ClassloaderExecutor(classloader);
 cle.execute(aRunnable); 
对象结果= cle.execute(aCallable);  //结果被克隆回原始CL

看一下svn repo中的测试用例 。

它也可以在Maven中使用:

 <依赖性>
     <的groupId> org.powermock 
      powermock-类装入
     <版本> 1.4.6