どうも、はむばねです。
本日、研修はJDBCの分野に入りました。
やったことがある方はわかると思いますが、JDBCの初っ端の初っ端で出てくるのが『Class.forName("JDBCドライバの完全修飾名")』という構文なわけです。
もうね、いきなり何を言っとるんだと。
しかも大抵の場合(というか、たぶん「絶対」と言い切っていいと思いますが)、そこの説明はなしで「こういうものなのでこう書いてください」という扱いなわけです。
たぶん形式的にClassクラスのstaticメソッドなのだろうというところまでは推測できても、そこまでなわけですよ。
そこでちょっと調べてみると、ClassクラスのforNameメソッドは「引数で指定されたオブジェクトを返す」とか出てくるわけですね。
そしたら今度は、「それってnewと何が違うねん」という疑問が出てくるわけです。
そっちは調べてみても、「newとは違います」という言葉は出てきても「ロードする」だとか「Class型のオブジェクトをインスタンス化する」だとかでnewとは違うとか出てくるわけで。
もうね、だから何を言ってるんだと。
しかも結局、オブジェクトを生成するとしてそれを参照してるわけでもないどうやって使うんだと。
朝っぱらから、そこで悩みましたね。
もうね、2時間近くは悩んだ。
そしたら、お昼前にようやく理解が及びました。
それが理解できたことがあまりに嬉しかったので、調子に乗ってひっさびさにテーマ「情報系」いっくよー\(^o^)/

ちなみに私は自己流で調べて自分なりに理解した気になっているに過ぎないので、詳しい方がいらっしゃれば間違い等指摘してください。


んで。
正直、理解さえしてみれば極々簡単なお話だと思います。
調べてる最中散々出てきた説明(上記がその一部)も、なるほど確かにその通りだと思いました。
ポイントはつまるところ、Classクラスとは.classファイルをプログラム上にロードした時の型だというところです。

図にすると、こう!

あなたに送る独り言byはむばね

まず、.classファイルが最終的にはプログラム領域中にロードされるというのはOKですよね?
そうしないと、プログラムが使えませんからね。
んで、そのプログラム領域中のどっかにあるクラスを、どっかのオブジェクトがnewすることによってインスタンス化するわけです。


あなたに送る独り言byはむばね

そして、その「プログラム中のどっかにあるクラス」というのが、まさにClassクラス型でオブジェクトとして保持されているわけです。
ここまでわかりゃあ、もう簡単。
Class.forNameというのはClass型のオブジェクトを生成するものなんだから……



あなたに送る独り言byはむばね

こんな感じで、プログラム中にクラスをロードする作業を行うんだね。



      ,.ィ , - 、._     、
.      ,イ/ l/       ̄ ̄`ヽ!__
     ト/ |' {              `ヽ.            ,ヘ
    N│ ヽ. `                 ヽ         /ヽ /  ∨
   N.ヽ.ヽ、            ,        }    l\/  `′
.  ヽヽ.\         ,.ィイハ       |   _|
   ヾニー __ _ -=_彡ソノ u_\ヽ、   |  \   つまりClass.forName()とは、
.      ゙̄r=<‐モミ、ニr;==ェ;ュ<_ゞ-=7´ヽ   >  動的なクラスコンパイル(的な作業)
.       l    ̄リーh ` ー‐‐' l‐''´冫)'./ ∠__  を行うメソッドだったんだよ!
       ゙iー- イ'__ ヽ、..___ノ   トr‐'    /    
       l   `___,.、     u ./│    /_ 
.        ヽ.  }z‐r--|     /  ト,        |  ,、
           >、`ー-- '  ./  / |ヽ     l/ ヽ   ,ヘ
      _,./| ヽ`ー--‐ _´.. ‐''´   ./  \、       \/ ヽ/
-‐ '''"  ̄ /  :|   ,ゝ=<      /    | `'''‐- 、.._
     /   !./l;';';';';';';\    ./    │   _
      _,> '´|l. ミ:ゝ、;';';_/,´\  ./|._ , --、 | i´!⌒!l  r:,=i   
.     |     |:.l. /';';';';';|=  ヽ/:.| .|l⌒l lニ._ | ゙ー=':| |. L._」 ))
      l.    |:.:.l./';';';';';';'!    /:.:.| i´|.ー‐' | / |    |. !   l
.     l.   |:.:.:.!';';';';';';';'|  /:.:.:.:!.|"'|.   l'  │-==:|. ! ==l   ,. -‐;
     l   |:.:.:.:l;';';';';';';';| /:.:.:.:.:| i=!ー=;: l   |    l. |   | /   //
       l  |:.:.:.:.:l;';';';';';';'|/:.:.:.:.:.:.!│ l    l、 :|    | } _|,.{::  7 ))
        l  |:.:.:.:.:.:l;';';';';'/:.:.:.:.:.:.:.:| |__,.ヽ、__,. ヽ._」 ー=:::レ'  ::::::|;   7
.      l |:.:.:.:.:.:.l;';';'/:.:.:.:.:.:.:.:.:.|. \:::::\::::: ヽ  ::::::!′ :::|   .:/
.       l |:.:.:.:.:.:.:∨:.:.:.:.:.:.:.:.:.:.:.!   /ヽ::: `:::    ::::  ....::..../ 



      _人人人人人人人人人人人人人人人_
        >      な、なんだってー!!    <
        ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
   ∩___∩              ∩____∩
   | ノ     u ヽ            / u     u └|  ∩____∩
  / # ●   ● |           | ●   ● # .ヽ/  u    └|
  | u   ( _●_)  ミ          彡   (_●_ ) u  |●   ● # ヽ
 彡、   |∪|  、`\        /     |∪|    彡  (_●_) u   |
/ __  ヽノ /´>  )       (  く   ヽ ノ   / u   |∪|    ミ
(___)   / (_/        \_ )      (  く   ヽ ノ     ヽ



これを理解した瞬間は、マジで脳内で↑のAAが再生されましたね。
もうこれを誰かに言いたくて言いたくて、ブログを更新する気力を残すため自習(私はいつもサポーター役で残ってる)もそこそこに帰ってきたわ。

しかし正直これ、一人でやってたら割と早々に諦めて「まぁそう書けってーならそう書くわ」となってたと思います。
が、質問された時に答えられなかったら困るなーというただそれだけの理由で悩み続けましたよ。
結局そんな質問出なかったけどな!
少なくとも想定質問(自分が感じた疑問)には絶対に自分なりの答えを出すようにしているはむばね先生です。
しかし、今日ほどそうやって「先生」やってて良かったと思ったことはないですね。
これがわかった瞬間は本当に気持ちよかった。

ちなみにそんなわけなので、実際にはClass.forName()ではドライバのクラスをロードしているだけ。
DriverManagerオブジェクト(の、正確にはstatic initializerらしいですが)がそれをインスタンス化して使うわけですね。
改めて説明すると簡単なことなんですが、なかなか解説してくれてるところがないんですよね。
正直、今朝の私がこの記事に飛んでたら速攻理解できてたと思う。
というわけで、この記事が誰かの理解に役立てば幸いです。


AD

コメント(14)