Что такое чистый / быстрый способ вызова методов со сложными объектными параметрами в другом загрузчике классов? - PullRequest
0 голосов
/ 02 декабря 2011

Мы работаем над ситуацией, когда мы можем запускать обработку на разных версиях нашего процессора.Мы загружаем каждую версию в другой загрузчик классов.Но API, который мы должны вызвать, использует наши собственные классы, которые могут меняться в зависимости от версии.Таким образом, класс может иметь другое определение в загрузчике классов вызывающего абонента, чем определение в загрузчике классов вызываемого абонента.

Я ищу высокопроизводительный способ решения этой ситуации.Насколько я понимаю, сериализация объектов может сильно повлиять на производительность, и если класс достаточно изменился, он вообще не будет работать.

Ограничение: мы не можем изменять код, который мы хотим вызвать.Мы могли бы включить новый код в загрузчик классов вызываемого, но мы не можем изменить код, который пытаемся запустить.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2011

Я думал об этом последние дни, это одна интересная проблема.

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

Вы запускаете виртуальную машину со старой версией ваших классов, предоставляя ей методы RMI. Затем из вызывающего Classloader вы запускаете соединения RMI с этой другой виртуальной машиной, чтобы получить наборы данных из старых, которые НЕ являются экземплярами классов, а являются стандартными объектами Java (например, картой). Затем вы переносите эту карту на сайте абонента в экземпляр нужной вам версии.

Таким образом, у вас нет конфликтующих версий класса в одной виртуальной машине.

При необходимости я могу предоставить вам пример кода, чтобы продемонстрировать, что я имею в виду, но впереди у вас много реализаций:)

Что касается части производительности: если вы достаточно плотно сконструируете интерфейсы взаимодействующих частей RMI, накладные расходы RMI не будут стоить вам дорого, и в каждой виртуальной машине нет больших проблем сериализации.

Веселитесь (и, если вам все равно, оставьте записку о том, как все получилось)

0 голосов
/ 02 декабря 2011

Вы можете использовать интерфейсы или абстрактные классы, которые загружаются загрузчиком системных классов и реализуются различными версиями вашего процессора.Теперь, когда вы загружаете ваши процессорные реализации в их собственные пользовательские загрузчики классов, они все равно будут связывать с интерфейсами из системного загрузчика классов и, таким образом, все будут реализовывать одни и те же внутренние интерфейсы.Результат такой же быстрый, как и в Java, но вам нужно иметь интерфейсы, которые остаются стабильными в разных версиях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...