Замена для диспетчера безопасности checkMemberAccess () - PullRequest
0 голосов
/ 18 декабря 2018

Метод Java Security Manager checkMemberAccess() имеет параметр, который содержит класс, для которого вызывается Reflection.Этот метод устарел, в описании говорится, что вместо него следует использовать checkPermission()checkPermission() отсутствуют параметры, аналогичные параметрам в checkMemberAccess().

. В диспетчере безопасности как получить целевой класс Reflection без метода checkMemberAccess()?

т.е. если класс A выполняет отражение над классом B, я хочу знать, что целью был класс B.

1 Ответ

0 голосов
/ 26 декабря 2018

При установке менеджера безопасности по умолчанию - приложение затем использует политику безопасности по умолчанию.Если вы хотите предоставить нашу собственную политику, вы можете сделать это в файле политики, записанном как:

grant {
   permission java.lang.RuntimePermission "accessDeclaredMembers.{class name}";
   permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};

CheckMemberAccess имеет политику по умолчанию - чтобы разрешить доступ и членам PUBLIC, а такжекак доступ к классам, которые имеют тот же загрузчик классов, что и вызывающий.Во всех других случаях этот метод вызывает checkPermission () с RuntimePermission ("accessDeclaredMembers") разрешение

Для операций отражения используйте ReflectPermission class и suppressAccessChecks , который позволяет подавлять стандартные проверки доступа Java - для общедоступного, доступа по умолчанию (пакетного), защищенного и закрытого членов - выполняемые отраженными объектами в точке их использования.

Ноэто опасно в этой информации ( возможно конфиденциально ), и методы, которые обычно недоступны, будут доступны вредоносному коду.

После того, как вы предоставили файл политики - вы можете проверить его следующим образом:

 try {
   ReflectPermission permission = new ReflectPermission("suppressAccessChecks");
   permission.checkGuard(null);
   System.out.println("Permission granted");
 } catch (SecurityException e) {
   System.out.println("Permission denied");
 }
...