Копировать Java-объект / класс из одного загрузчика классов в другой загрузчик классов - PullRequest
8 голосов
/ 15 ноября 2009

Привет, есть ли способ скопировать один загруженный классом класс (атрибуты и т. Д.) Из одного загрузчика классов (например, «созданный» класс Point) в другой загрузчик классов?

Прояснение, Пример: У меня есть объект Point на CL 1. Теперь, работая на другом CL2, я хочу создать этот объект в CL 3.

Некоторые объекты:

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% -ной» java отражения rconstruct, в основном получающей поля объекта из CL2 и настраивающей на новый объект.

PS: он должен работать на Java 1.4.2: '(

Ответы [ 4 ]

7 голосов
/ 15 ноября 2009

См. Transloader о том, как копировать классы между ClassLoaders, если вам нужно выполнить одно из следующих действий:

  • Клонирование практически любого графа объектов из одного ClassLoader в другой

  • Возьмите любой объект из чужого ClassLoader и вызовите любой метод для него, не клонируя его

1 голос
/ 06 января 2010

Я считаю, что он имеет тот же класс (с тем же именем), но загружен и определен двумя загрузчиками классов. Лучше всего исправить вашу систему, чтобы класс не загружался и дважды.

0 голосов
/ 30 августа 2010

Загрузка классов PowerMock также предоставляет нечто похожее на TransLoader и поддерживает более сложные варианты использования, такие как (некоторые) отражения. Вы можете легко выполнить Runnable или Callable:

ClassloaderExecutor cle = new ClassloaderExecutor(classloader);
cle.execute(aRunnable); 
Object result = cle.execute(aCallable); // Result is cloned back to original CL

Взгляните на контрольный пример в репозитории svn.

Это также доступно в Maven:

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-classloading</artifactId>
    <version>1.4.6</version>
</dependency>  
0 голосов
/ 17 ноября 2009

Если класс так же прост, как вы описываете его в вашем случае, вы можете посмотреть на XMLEncoder . Его использование имеет серьезные ограничения, но в простых случаях оно должно выполнять свою работу.

РЕДАКТИРОВАТЬ: Учитывая это ограничение, я бы сказал, поместить данные в карту и использовать это. Вы могли бы даже сделать так, чтобы два класса сохраняли свое состояние внутри Карты, чтобы движение было довольно плавным.

Если это не сработает, то, похоже, вы сталкиваетесь с собственным XML / JSON или просто CSV, в зависимости от сложности данных.

...