前言#
TopicCommand.main(args)
在通过 zookeeper
去执行 kafka
的创建 topic
命令时碰到的一个问题,在开源工具的代码内部最终执行创建 topic
的时候会去做一个 System.exit(0)
的操作,这样就会导致我们的 JVM
被终止掉,这个时候我们又无法去修改工具代码,所以可以换个角度尝试去捕获 System.exit(status)
实现#
继承 SecurityManager
这个类,来自 java.lang
然后重写 checkExit(int status)
这个方法
static class DemoSecurityManager extends SecurityManager {
@Override public void checkExit(int status) {
throw new SecurityException();
}
}
在调用会执行 System.exit(status)
的代码块前加入这个代码,并 try-catch
这段代码
@Test
void testMain() {
System.out.println("startMain");
DemoSecurityManager demoSecurityManager = new DemoSecurityManager();
System.setSecurityManager(demoSecurityManager);
try {
main(new String[]{});
} catch (Exception e) {
System.err.println("跳过退出错误的方法,继续执行");
}
System.out.println("endMain");
// 防止内存溢出
System.setSecurityManager(null);
}
public static void main(String[] args) {
System.out.println("testMain");
System.exit(0);
}
这样最终执行结果为
startMain
testMain
endMain