我创建了一个简单的插件系统,允许其他人上传他们的插件jar,插件系统会加载它并在其中执行一些代码。
插件系统将获得Function<Input, Output>
的子类来执行加载的插件逻辑,但我不希望该Function创建新的Thread或执行像System.exit
这样的危险操作。我怎么能禁止这个动作?
我在Java中找到了AccessController
或SecurityManager
,如何使用它来实现我的意图。
答案 0 :(得分:4)
就像你说的,你可以添加一个安全管理器。类似下面的内容:您可以将代码放在try catch块中并捕获抛出的自定义安全异常。下面的代码在循环中运行并继续调用System.exit(1);
import java.security.Permission;
public class TestPreventSystemExit {
public static void main(String[] args) {
forbidSystemExitCall();
while (true) {
try {
System.exit(1);
} catch (Exception ex) {
}
}
}
private static class PreventExitException extends SecurityException {
}
private static void forbidSystemExitCall() {
final SecurityManager securityManager = new SecurityManager() {
public void checkPermission(Permission permission) {
if (permission.getName().indexOf("exitVM") >= 0) {
System.out.println("Why you did this to me? :)");
throw new PreventExitException();
}
}
};
System.setSecurityManager(securityManager);
}
}
答案 1 :(得分:1)