ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

特権の意味

2009-04-15 23:59:12 | PG(Java)

DriverManagerのソースを見ていたら、jarファイルからドライバー一覧を取得する所とかでAccessController.doPrivileged()というメソッドを使っている箇所があったので、これは何だろう?という興味だけでちょっと調べてみた。
これは、セキュリティーマネージャーとの関連で特権ブロックを作り出して実行するものらしい。

「特権」という名前から想像されるのは、セキュリティーポリシーで定義されている許可権限を越えてメソッドが呼び出せるようにするもの?
CPUとかOSだと、ユーザーモードと特権モード(カーネルモード・システムモード)があって、必要に応じてユーザーモードから特権モードに移行して処理を実行したり出来る。

でもJavaのセキュリティーの「特権」は そういうものじゃないらしい。
「自分(呼出元)が、自分より高い権限で外部のメソッドを呼べる」のではなく、
「呼ばれたメソッドが、呼出元の権限とは無関係に自分自身に与えられた権限で実行できる」ことを『特権』と呼ぶようだ。
doPrivileged()のサンプルを見ているだけだと、その辺りの関連が分かりづらい気がする…(理解力が低いだけ?(爆))

あと、別件になるけど、doPrivileged()のサンプルを見ていてショック!
内部クラス(インナークラス)から外側クラスのフィールド(やメソッド)にアクセスできるのは知っていたが、メソッド内に書かれている局所クラスからそのメソッドのローカル変数にはアクセスできない(ので不便だ)と思っていたら、finalなローカル変数にはアクセスできるらしい!
引数を渡したくて、無名内部クラスにコンストラクターを定義する方法が無いかとか探して(←それは無理っぽい)諦めていたのに、そんな方法があったとは…。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

サービスプロバイダー(sun.misc.Service)

2009-04-14 23:07:10 | PG(Java)

JDK1.6のDriverManagerのJavadocを見ていたら、「サービスプロバイダメカニズムをサポートするように拡張された」と書いてあった。
サービスプロバイダーって何じゃらほい?と思って調べてみた

DriverManagerがJDK1.6(JDBC4.0)からサポートした仕組みと言ったら、jarファイルの中にクラス名を書いたファイルを置いておいて、それを読み込むもの。
サービスプロバイダーというのは、その仕組み自体のことらしい。
JDBCドライバーの具象クラス名を書いたファイル名が「java.sql.Driver」で、インターフェース名そのものだった(せめて拡張子を何か付けないのかと疑問に思った(苦笑))のは、このサービスプロバイダーの仕様に則ったものだったわけだ。
色々なクラスでも汎用的に使えるようにする為には、確かにクラス名そのものにしちゃうのが一番楽かも。(実装上も、ファイル名を考える手間も)

DriverManagerがサービスプロバイダーを使うようになったのがJDK1.6からなので
サービスプロバイダー自体も新しい仕組みなのかと思ったら、少なくともJDK1.3の頃からある由緒正しい仕組みだったらしい^^;(JDK1.3のJARのJavadocに載ってた)
そんなの全然知らなかったなー(汗)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

JDBCドライバーの動的ロード

2009-04-13 23:29:51 | PG(Java)

JavaDBを使うアプリをいざjarファイル化して実行しようとしたら、エラー(爆)

Eclipseで作って実行していたので、JavaDBのライブラリーであるderby.jarとかは常にクラスパスに入っていたので問題なかったのだが。
独立したアプリケーションにする場合、Windowsではjarファイルそのもの(プロパティー)にクラスパス等のオプションを指定できないので、クラスパスをどうにかしたかったらバッチファイルを作るしか無いのかな。

まぁそれくらいはどうってことないのですぐ作れたけど、バッチファイルをダブルクリックすると、一旦コンソールが起動するのがちょっとヤダ。
どうせなら実行可能jarファイル形式にして、jarファイルをダブルクリックしたら起動するようにしたいよなー。
jarファイルのマニフェストの中に依存するライブラリーを指定できるけど、これは相対パス(で、しかもパスにスペースが入っていたらダメっぽい)なので、derby.jarとかは指定しづらい。(アプリと同じ場所に一回コピーすれば済む話ではあるけど、そういう手間はなるべくかけたくない)

ここでふと思い出す。
Javaで作られたDBアクセスのツールって、jarファイル(とクラス名)を指定したら、そのままアクセス出来てるよな…。何らかの方法はあるはず。(裏でクラスパスを指定してJavaVMを別途起動している可能性も無くはないけど^^;)

という訳で、DriverManagerについて調べてみた。
JDBC3.0のClass.forName()の意味やJDBC4.0の追加機能がよく分かった。
でも自分でロードしたクラスが登録できないのはちょっとショック。セキュリティー上、しょうがないのかもしれないけど。
まぁ、リフレクションを使うイマイチな方法を経て、最終的には納得いく方法を見つけたけど…これでいいのかな?

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ポップアップメニュー

2009-04-11 22:50:53 | PG(Java)

Swingのポップアップメニュー(JPopupMenu)についてメモ。

JTextFieldとかのテキスト入力コンポーネントなら、デフォルトで編集メニュー(コピー&ペーストのメニュー)くらい出してくれても良さそうな気がしないでもないけど、そうすると独自メニューを追加するのが面倒になるから最初から何も無いのだろうか。

まぁポップアップメニューなら右クリックイベントに対してポップアップのクラスにメニューを追加して表示するだけー、メニューの追加方法もメニューバーと大差ないからそんなに大変じゃないだろー。と思ったら。

確かにてきとーに作ってみるだけならそれほど大変でもないんだけど、ちゃんとやろうと思ったら意外と奥が深い。
ポップアップトリガーなんて知らなくても、右クリックイベントでポップアップ表示できちゃうもんなぁ。

あと、JDK1.5からコンテキストメニューキーが使えるようになっていたらしい。
そんな名前聞かされても何のことだか分からないけど、Windowsのキーボードの右下に付いている(かもしれない)、“メニューを指してるマウスカーソルの絵”が描かれているキー。アプリケーションキーとも言うらしいが。
普通のWindowsアプリなら、このキーを押した時にもポップアップメニューが出る。
そうと知ってれば、このキーも実装したくなるよな~。
とりあえず普通のキーイベント処理で実装できたけど、こいつにもマウスのポップアップトリガーみたいなメソッドがあったりするのかなぁ…。

そういえば、マウスの座標をマウスイベント以外で取るメソッドなんてあったっけ、と思ったら、JDK1.5で加わっていたらしい。
(他の方法といえば、マウスの移動イベントを常に捕捉して自分で保持しておく方法くらいしか思い付かないけど、JDK1.4ではどうしてたんだろう?)

ちなみにJDK1.5では、WindowsロゴキーもKeyEventのVK_WINDOWSとして定義されている。でもそれで何をどうしろと言うんだ^^;


さて、なんだか本来作りたい物からわき道に逸れてばかりのような感じもするけど、そろそろ本筋に戻れるかなぁ。

コメント (1)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

DatabaseMetaDataとResultSetMetaData

2009-04-10 05:48:17 | PG(Java)

JDBCのメタデータにはDatabaseMetaDataとResultSetMetaDataがある。
どちらでもテーブルの項目の属性を取得できるが、違いがあるようなのでちょっと比較してみた。

ResultSetMetaDataはSELECT文を実行しないといけないので静的な情報(テーブル定義)を取得する目的ではないような気がするが、逆にSELECT文で演算したりした場合も属性が取得できるので、SQL実行時に使うにはResultSetMetaDataの方がいいようだ。

DatabaseMetaDataでは項目の型の桁数を取得するのにCOLUMN_SIZEというのがあって、ResultSetMetaDataで対応するのがgetColumnDisplaySize()かと思ったら、取れる値が違う。
ResultSetMetaDataの方では桁数を取得するメソッドが無いのかーと思ったら、getPrecision()がそのメソッドらしい。やはりJavadocはちゃんと見るべきだな^^;
しかしなんで他のメソッドは「getColumn」で始まってるのに、これはそうじゃないんだ(苦笑)
ついでに、isNullable()もちょっと微妙。「is」で始まってるからbooleanかと思いきや、戻り値はint。自分もこういう命名はたまにやっちゃうけど、あんまり良くないよな(苦笑)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする