48
45

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

知ってるようで知らないClassクラス(基本編)

Last updated at Posted at 2015-07-21

■前置き
JavaにClassクラスが存在することを大抵のJava技術者はご存知だと思いますが、実際、Classクラスとは何なのか、いつ、どうやって生成されるかなど、知らない人がほとんどではないでしょうか?

多分、使ったことがあるのは、主に以下の2パターン
1.DB接続時にドライバクラスをforName()する。
2.インスタンスからクラス情報を取得する

1は多分、みんな、おまじないのように使ってる。
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
って感じで、よくわからないけど、上記のようにドライバクラスを指定してからじゃないとDB接続できないから、おまじないとして使ってる。という人が多いと思います。

2は用途はいろいろですが、インスタンスからgetClass().getName()してクラス名を取得して、ログに出したり、なんちゃらしたりだと思います。

■Classクラス
すべてのクラスのスーパークラスである java.lang.Object クラスにgetClass()というメソッドが実装されており、サブクラスのインスタンス生成時に該当のサブクラスのClass情報をClassクラスのインスタンスとして生成し、保持します。
また、同時にObjectクラスにはclassというpublic static finalフィールド(メンバ変数)が存在し、クラスロード時に生成され、String.classという様にすることで、対象のクラスのClassクラスを取得することができる。
※更に詳細に話すと、ClassLoaderクラスとリフレクションの話をしなければなりませんが、そこを話すと長くなりますので、今回は割愛します。

■Class.forName(”DBドライバクラス”)
ちょっと余談になりますが、前置きで書いたDBドライバをforName()する理由について説明します。
このforName()メソッドは、引数に文字列で指定したクラスのClassクラスを取得するのが、本来の使い方です。ですので、DBドライバクラスをforNameすると、返り値として、DBドライバクラスのClassクラスを取得できます。しかし、DBドライバクラスをforName()する理由はClassクラスを取得するためではありません。
forName()することにより、DBドライバクラスがロードされ、staticイニシャライザが実行されます。DBドライバクラスは全て、java.sql.Driverを実装しており、各DBドライバクラスでは、staticイニシャライザでDriverManagerクラスというドライバを管理するクラスにDBドライバクラス自身を登録しに行くという処理を実施しています。
こうすることにより、後続処理で各DBドライバを利用しての、DB接続処理を実施することができるようになる。

※誤りございましたら、申し訳ありませんが、ご指摘願います。

48
45
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48
45

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?