您的位置:首页 > 编程语言 > Java开发

通过继承SecurityManager实现系统退出检查

2017-02-19 17:47 281 查看
有时会遇到一个问题,系统运行时忽然退出,怀疑执行了System.exit方法,但是无法排查是哪里调用。可通过java的SecurityManager机制来进行检查。

实现一个继承SecurityManager的子类,重写checkExit方法,并通过 -Djava.security.manager设置,就可监测到哪里执行了System.exit方法。

如下列代码,将执行了System.exit方法打印出来

public class ExitPrintSecurityManager extends SecurityManager {

private final int runtimeStackIndex = 3;

@Override
public void checkExit(int paramInt) {
String exitName = "Runtime.exit";
StackTraceElement[] stack = Thread.currentThread().getStackTrace();
if (stack.length > runtimeStackIndex) {
int sourceIndex = runtimeStackIndex;
StackTraceElement source = stack[sourceIndex];
if ("java.lang.System".equals(source.getClassName()) && "exit".equals(source.getMethodName())) {
source = stack[++sourceIndex];
exitName = "System.exit";
}
System.out.println(exitName + " in " + source);
System.out.println("Stack trace as follows:");
printStack(sourceIndex, stack);
} else {
System.out.println("Can not print System.exit");
}
}

private void printStack(int sourceIndex, StackTraceElement[] stack){
for (int i = sourceIndex - 1; i < stack.length; i++) {
System.out.println("        " + stack[i]);
}
}

@Override
public void checkPermission(Permission perm, Object context) {
// allow anything.
}

@Override
public void checkPermission(Permission paramPermission) {
// allow anything.
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java Security checkExit
相关文章推荐