DriverManagerのソースを見ていたら、jarファイルからドライバー一覧を取得する所とかでAccessController.doPrivileged()というメソッドを使っている箇所があったので、これは何だろう?という興味だけでちょっと調べてみた。
これは、セキュリティーマネージャーとの関連で特権ブロックを作り出して実行するものらしい。
「特権」という名前から想像されるのは、セキュリティーポリシーで定義されている許可権限を越えてメソッドが呼び出せるようにするもの?
CPUとかOSだと、ユーザーモードと特権モード(カーネルモード・システムモード)があって、必要に応じてユーザーモードから特権モードに移行して処理を実行したり出来る。
でもJavaのセキュリティーの「特権」は そういうものじゃないらしい。
「自分(呼出元)が、自分より高い権限で外部のメソッドを呼べる」のではなく、
「呼ばれたメソッドが、呼出元の権限とは無関係に自分自身に与えられた権限で実行できる」ことを『特権』と呼ぶようだ。
doPrivileged()のサンプルを見ているだけだと、その辺りの関連が分かりづらい気がする…(理解力が低いだけ?(爆))
あと、別件になるけど、doPrivileged()のサンプルを見ていてショック!
内部クラス(インナークラス)から外側クラスのフィールド(やメソッド)にアクセスできるのは知っていたが、メソッド内に書かれている局所クラスからそのメソッドのローカル変数にはアクセスできない(ので不便だ)と思っていたら、finalなローカル変数にはアクセスできるらしい!
引数を渡したくて、無名内部クラスにコンストラクターを定義する方法が無いかとか探して(←それは無理っぽい)諦めていたのに、そんな方法があったとは…。