我已经创建了一个简单的插件系统,允许其他人上传他们的插件的jar,插件系统将加载它并在其中执行一些代码。如何禁止一个jar在java中创建新线程
插件系统将获得Function<Input, Output>
的子类来执行加载的插件逻辑,但我不希望该函数创建新线程或执行一些危险操作,如System.exit
。我怎么能禁止这个动作?
我在Java中找到了AccessController
或SecurityManager
,如何使用它来实现我的意图。
我已经创建了一个简单的插件系统,允许其他人上传他们的插件的jar,插件系统将加载它并在其中执行一些代码。如何禁止一个jar在java中创建新线程
插件系统将获得Function<Input, Output>
的子类来执行加载的插件逻辑,但我不希望该函数创建新线程或执行一些危险操作,如System.exit
。我怎么能禁止这个动作?
我在Java中找到了AccessController
或SecurityManager
,如何使用它来实现我的意图。
就像你说的,你可以添加一个安全管理器。像下面这样:你可以把你的代码放在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);
}
}
链接的答案描述了如何使用SecurityManager来防止线程启动,所以我不确定如何得出结论,这是不可能的。从答案中可以得出结论:“解决这个问题的一个方法是继承java.lang.SecurityManager并覆盖getThreadGroup方法以返回根ThreadGroup。这将允许您控制代码是否可以根据它是否具有java创建线程。 lang.RuntimePermission“modifyThreadGroup”。“ –
感谢您对我更新我的答案的快速反馈;-) – GhostCat
@GhostCat FGITW嗯? – Gab