我们正在使用支持插件的Java 1.7应用程序,客户可以使用Java编写自己的插件。我们想要限制插件来调用System.exit。我们可以通过SecurityManager来完成。但是,在核心应用程序中,我们想要调用System.exit时很少见。有没有办法从SecurityManager中排除类或包?
答案 0 :(得分:3)
与Batty的答案类似,但您可以再次禁用设置安全管理器并覆盖checkExit()方法。我要做的是允许调用System.exit()但这应该触发插件停止/卸载而不是退出整个JVM。
您可以使用Thread.currentThread()。getStackTrace()来计算出名为System.exit()的代码;
答案 1 :(得分:1)
我认为你正在寻找这个:
private static class ExitTrappedException extends SecurityException
{
}
private static void forbidSystemExitCall()
{
final SecurityManager securityManager = new SecurityManager() {
public void checkPermission( Permission permission )
{
if( "exitVM".equals( permission.getName() ) )
{
throw new ExitTrappedException() ;
}
}
} ;
System.setSecurityManager( securityManager ) ;
}
private static void enableSystemExitCall()
{
System.setSecurityManager( null ) ;
}
这是在你的类中,从中调用插件。
在forbidSystemExitCall
和enableSystemExitCall
之间拨打电话。