System.exit(status)
実際に呼び出しをRuntimeクラスに委譲します。このシャットダウン要求を続行する前のランタイムは、 SecurityExceptionをスローすることで差し迫ったシャットダウンを防ぐことができるcheckExit(status)
JVM の現在のSecurityManagerを呼び出します。
通常、SecurityManagerは、現在のスレッドが現在のセキュリティ ポリシーによって定義されたシャットダウンの特権を持っているかどうかを確認する必要がありますが、必要なのはこの終了呼び出しから回復することだけなので、ここでキャッチする必要があるSecurityExceptionをスローするだけです。私たちのJUnitテストケース。
JUnit テスト クラスで、メソッドにSecurityManagerをセットアップします。setUP()
securityManager = System.getSecurityManager();
System.setSecurityManager(new SecurityManager() {
@Override
public void checkExit(int status) {
super.checkExit(status); // This is IMPORTANT!
throw new SecurityException("Overriding shutdown...");
}
});
SecurityManagerを、前に保存したインスタンスに再度tearDown()
置き換えます。そうしないと、JUnit がすぐにシャットダウンできなくなります。:)
参照:
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/SecurityManager.html
http://docs.oracle.com/javase/1.5.0/docs/api/java /lang/SecurityManager.html#checkExit(int)
SecurityManager クラスには、単語 check で始まる名前のメソッドが多数含まれています。これらのメソッドは、潜在的に機密性の高い特定の操作を実行する前に、Java ライブラリのさまざまなメソッドによって呼び出されます。このようなチェック メソッドの呼び出しは、通常、次のようになります。
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkXXX(argument, . . . );
}
これにより、セキュリティ マネージャには、例外をスローして操作の完了を防止する機会が与えられます。セキュリティ マネージャ ルーチンは、操作が許可されている場合は単純に戻りますが、操作が許可されていない場合は SecurityException をスローします。