Как дать различные разрешения к различным классам Java?

Если подпись:

T operator+(T const& a, T const& b )

(как вы говорите в тексте вопроса, выделенном жирным шрифтом), то тело должно быть:

return T(a) += b;

, где объект результата является единственным T построенным. Версия T nrv( lhs ); nrv += rhs; return nrv; теоретически рискует, что компилятор не объединит nrv с объектом результата .


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

T operator+(T const& a, T const& b)
{
    return T(a) += b;
}

T operator+(T&& a, T const& b)
{
    return T(std::move(a)) += b;
}

В обоих случаях объект результата гарантированно будет единственным созданным объектом. В «классической» версии, принимающей T a, случай аргумента rvalue повлечет за собой дополнительный ход.

Если вы хотите выйти из правой части, то можно добавить еще две перегрузки:)

Обратите внимание, что я не рассматривал случай возврата T&& для причины, описанные здесь

6
задан erickson 23 November 2008 в 16:43
поделиться

2 ответа

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

Каждый класс имеет "кодовую базу", местоположение, из которого он был загружен. Таким образом, при упаковке каждого расширения в отдельном JAR (или взорванный в отдельном каталоге), Вы сможете, адаптируют разрешения, данные в соответствии с той кодовой базой.

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

Вот пример файла политики:

grant codeBase "file:/path/to/app/lib/*" {
  permission java.io.FilePermission "/path/to/app/-", "read";
  permission java.io.FilePermission "/path/to/app/data/-", "read,write,delete";
};

grant codeBase "file:/path/to/app/ext/*" {
  permission java.util.PropertyPermission "java.io.tmpdir", "read";
  permission java.io.FilePermission "${java.io.tmpdir}/myapp/-", "read,write,delete";
};

Этот простой пример должен работать в любой версии Java. Более новые версии расширили синтаксис политики для предоставления разрешений к предмету, аутентифицируемому JAAS.

10
ответ дан 9 December 2019 в 20:50
поделиться

Я не знаю детали реализации, но кажется тем, что Вы имеете в виду, близко подходит к тому, что уже делает сервер Tomcat Apache. Отдельные веб-приложения в Tomcat сохранены разделенными имеющими различными отдельными загрузчиками класса. Возможно, это стоит взглянуть на код там.

2
ответ дан 9 December 2019 в 20:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: