Замена для диспетчера безопасности checkMemberAccess()
Метод Java Security Manager checkMemberAccess()
имел параметр, который содержал класс, к которому вызывался Reflection. Этот метод устарел, с описанием использования checkPermission()
вместо. Там нет параметров в checkPermission()
которые похожи на те, что в checkMemberAccess()
,
В диспетчере безопасности как получить целевой класс Reflection без checkMemberAccess()
метод?
то есть, если класс A выполняет отражение в классе B, я хочу знать, что целью был класс B.
1 ответ
При установке менеджера безопасности по умолчанию - приложение затем использует политику безопасности по умолчанию. Если вы хотите предоставить нашу собственную политику, вы можете сделать это в файле политики, написанном как:
grant {
permission java.lang.RuntimePermission "accessDeclaredMembers.{class name}";
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};
CheckMemberAccess имеет политику по умолчанию - разрешить доступ к членам PUBLIC, а также доступ к классам, которые имеют тот же загрузчик классов, что и вызывающая сторона. Во всех других случаях этот метод вызывает checkPermission() с разрешением RuntimePermission("accessDeclaredMembers")
Для отражающих операций используйте класс ReflectPermission и suppressAccessChecks, который позволяет подавлять стандартные проверки доступа java - для общедоступного, доступа по умолчанию (пакетного), защищенного и закрытого членов - выполняемые отраженными объектами в точке их использования.
Но это опасно тем, что информация (возможно, конфиденциальная) и методы, которые обычно недоступны, будут доступны для вредоносного кода.
После того, как вы предоставили файл политики - вы можете проверить его следующим образом:
try {
ReflectPermission permission = new ReflectPermission("suppressAccessChecks");
permission.checkGuard(null);
System.out.println("Permission granted");
} catch (SecurityException e) {
System.out.println("Permission denied");
}