Два класса в разных пакетах, как их изолировать? - PullRequest
1 голос
/ 04 августа 2011

Нам нужно разработать игру, в которой пользователь может загрузить свой код, например, Rock Paper Scissor.Они должны реализовать некоторые методы из класса интерфейса, и мы вызываем их в нашем игровом классе, ничего особенного.

Код пользователей находится в пакетах, у нас нет конфликта имен,
, ноОсновная тема: Как мы можем обеспечить, чтобы пользователь A не вызывал методы из класса пользователя B?

Ответы [ 6 ]

3 голосов
/ 04 августа 2011

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


На самом деле, я думаю, что может быть недостаток вэтот.Если два класса «player» реализуют один и тот же интерфейс, они могут полиморфно вызывать методы, определенные в общем интерфейсе.Тот факт, что они загружаются в разные загрузчики классов и поэтому не могут использовать типы друг друга, не останавливает это.

Итак, вы по существу полагаетесь на блокировку отражения (и хорошее программирование) для предотвращения одного класса/ объект выводит экземпляр другого.Блокирующее отражение также не позволяет одному классу нарушать инкапсуляцию другого или вызывать методы, которые не определены в общем суперклассе или общем интерфейсе.

0 голосов
/ 04 августа 2011

Вы не можете, если это открытые методы, если только вы не изолируете в разных загрузчиках классов, и в этом случае каждый класс не может видеть друг друга.

Загрузка в разных загрузчиках классов - это то, как веб-контейнеры, такие какTomcat, Jetty и т. Д. Изолируют различные веб-приложения.

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

0 голосов
/ 04 августа 2011

Это все догадки, но посмотрите:

  • Менеджеры безопасности
  • Проверка байт-кода на недопустимые действия (например, с ASM)
  • Отдельный загрузчик классов длякаждая игра

Кроме того, вы можете разрешить пользователям загружать сценарии вместо реального кода Java, например ECMAScript, который вы можете запускать с Rhino.

0 голосов
/ 04 августа 2011

Одним простым способом может быть проверка того, что все методы имеют protected или default модификатор доступа , чтобы никто за пределами пакета не мог получить к ним доступ.

0 голосов
/ 04 августа 2011

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

Вы можете сделать ваши методы пакетными и закрытыми, и так далее, но вы бывсе еще приходится иметь дело с отражением и т. д.

Если бы я был там, где вы, я бы рассмотрел возможность взаимодействия с кодом пользователя через четко определенный сетевой протокол или через стандартный ввод / вывод.

0 голосов
/ 04 августа 2011
...