Java言語には、java.lang.reflectパッケージを通じて「裏技」のようなAPIが提供されています。このjava.lang.reflectパッケージを利用すると、公開されていないクラスのフィールドやメソッドを「のぞき見」できてしまいます。
ここでは、ラーメン・クラスをのぞき見してみます。
SnoopRamen.java | |
|
フィールド一覧 private java.lang.String Ramen.fSoup メソッド一覧 public java.lang.String Ramen.getSoup() public void Ramen.show()
ラーメン・クラスに、どのようなフィールドやメソッドがあるのかが、表示されていますね。特別なjarファイルをクラスパスに追加などするまでもなく、このような芸当ができることもJava言語の特徴の1つです。
さらに、java.lang.reflectパッケージを利用すると、カプセル化により保護されているはずのオブジェクトの内容を、書き換えることもできてしまいます。ラーメンのトッピングを勝手に変えて、「いちごラーメン」を作ってみます。
TrickRamen.java | |
|
上記のプログラムでは、「field.setAccessible(true);」を呼び出し、Java言語のアクセス修飾子とかかわりなく操作できるようにしてから、「field.set(ramen, "いちご");」を呼び出して、fToppingの値を書き換えています。
ラーメン・オブジェクトを確認 ラーメンを表示 トッピング: いちご スープ : とんこつ
このラーメン屋では提供していないはずの、「いちごラーメン」が出来上がってしまいました。
このように、java.lang.reflectパッケージはオブジェクト指向を「台無し」にしてしまう力を併せ持っています。ですから、よほど特殊な目的を実現するプログラミングを行う場合でもない限り、java.lang.reflectパッケージは「利用してはいけない」APIである、ということも、Java言語によるプログラミングの常識なのです。
Java言語を使ってオブジェクト指向の基本概念を見てきましたが、いかがだったでしょうか。オブジェクト指向は難しくとっつきにくいものですが、これを使いこなすといろいろな応用ができることが期待できます。
初心者のうちは、ほかの人やAPIなどがどのようにオブジェクト指向を扱っているのかを読む/知ることから学んでいくのが良い学習法だと思います。そして、オブジェクト指向の基本的な概念を理解したうえで、オブジェクト指向に関連する技術の中から、興味があるものにチャレンジしていってみましょう。
blanco Framework(コミッタ)
伊賀 敏樹(いが としき)
ハンドル:いがぴょん
1968年生まれ。現在、NTTデータ ビジネスブレインズ 第一SI事業部 ソリューショングループ所属。システム開発の技術支援などに従事する。仕事におけるJava言語とのかかわりは1998年から。 現在 blanco Frameworkというオープンソースによるソースコード自動生成タイプの開発フレームワーク提供に取り組んでいる。 趣味はヴァイオリン演奏。アマチュアオーケストラで演奏することもある。
ホームページ
いがぴょんの日記ウェブページv2(1996年から続けているWeb日記)
主な著書
「やさしく学ぶ基礎からのJDBC」
「Javaプログラミング[アプリケーション編]ステップアップラーニング」
Copyright © ITmedia, Inc. All Rights Reserved.