Предыдущий пример кода частично верен, но я обнаружил, что он блокировал доступ моего кода к файлам. Чтобы обойти эту проблему, я написал свой SecurityManager немного по-другому:
public class MySecurityManager extends SecurityManager {
private SecurityManager baseSecurityManager;
public MySecurityManager(SecurityManager baseSecurityManager) {
this.baseSecurityManager = baseSecurityManager;
}
@Override
public void checkPermission(Permission permission) {
if (permission.getName().startsWith("exitVM")) {
throw new SecurityException("System exit not allowed");
}
if (baseSecurityManager != null) {
baseSecurityManager.checkPermission(permission);
} else {
return;
}
}
}
В моем случае мне нужно было запретить сторонним библиотекам завершать работу виртуальной машины. Но были также некоторые тесты Grails, которые вызывали System.exit. Итак, я написал свой код так, чтобы он активировал пользовательский менеджер безопасности только непосредственно перед вызовом в стороннюю библиотеку (не обычное событие), а затем сразу же восстановил исходный менеджер безопасности, если он был, впоследствии.
Это все немного некрасиво. В идеале я бы предпочел просто удалить код System.exit, но у меня нет доступа к исходному коду сторонней библиотеки.