динамически создавать классы Java и делать их доступными по сети различными jvms, т.е. сериализуемыми - PullRequest
3 голосов
/ 27 апреля 2010

У меня есть требование динамического создания java-классов и обеспечения доступа к различным jvms по сети. Я пытался использовать инструмент отражения и javassist, но ничего не получалось. Позвольте мне объяснить сценарий мы используем Coherence распределенный кеш. Он может выполнять агрегацию / фильтрацию параллельно по всему кластеру. Например, если класс имеет [динамический класс], имеет переменную количества и методы getAmount / setAmount. Затем, если мы выполним запросы COHERENCE, он начнет процесс параллельно в кластере.

Я пытался создавать классы во время выполнения, используя javassist и рефлексию. Я могу получить к нему доступ из одной JVM, но когда я попытался получить доступ к тому же классу из другой jvm [через кластер когерентности]. Я получаю исключение для класса, не найденного [поскольку удаленный jvm не имеет представления об этом классе]. Я могу преодолеть это, динамически создавая тот же класс на удаленном jvm и получая доступ к методам. Но согласованность встроенных методов / функций не в состоянии найти класс. может ли кто-нибудь помочь мне в этом вопросе

Ответы [ 2 ]

0 голосов
/ 16 января 2014

Новый создаваемый класс должен быть доступен для всех узлов кластера. Это означает, что вновь созданный байт-код должен попасть в classpath / classloader JVM каждого узла. На мой взгляд, самым простым подходом было бы поместить сгенерированные классы на общий сетевой диск и сделать так, чтобы все JVM указывали на это общее сетевое расположение в своих путях классов. Каждый раз, когда JVM находит ссылку на новый класс, она должна динамически загружать его из общего сетевого ресурса.

0 голосов
/ 29 декабря 2013

Вы можете скопировать байтовый массив, созданный javassist, отправить этот байтовый массив по проводам и загрузить этот байтовый массив с помощью пользовательского ClassLoader. Таким образом, класс будет представлен на всех JVM.

...