【Java入門】リフレクションでメソッドの実行、フィールドの変更

リフレクションはクラスやメソッドを変数として扱うことができて、異なるクラスやメソッドを1つのプログラムで実行できるので便利です。

プログラムをテストする時などでよく使われたりします。

この記事ではリフレクションについて、

  • リフレクションとは
  • リフレクションの使い方
  • クラスの取得
  • インスタンスの生成
  • メソッドの取得と実行
  • privateフィールドの参照と変更
  • リフレクションの危険性について

など、リフレクションの基礎から具体的な使い方についても解説していきます。

リフレクションとは

リフレクションとは、クラス名やメソッド名を指定して「クラスを動的に実行する」ことです。

「クラスを動的に実行する」とはクラス名やメソッド名を文字列の変数として指定することで、クラス名やメソッド名を変更してもプログラムが実行できるようにしています。

クラス名やメソッド名を変数として変更してもプログラムが実行できるので、プログラムのテストなどで使用されますちなみに、コマンドラインでJavaのプログラムを実行する際に

と記述しますが、これもクラス名を変更してプログラムが実行できるのでリフレクションを行っていることになります。

リフレクションの使い方

リフレクションの使い方について、クラス、インスタンス、メソッド、フィールドの順にみていきましょう。

クラスの取得

クラスを取得するためにはClassクラスを使用しますClassクラスの使い方は以下のようにいくつか方法があります。

foNameメソッドを使用する場合は、ClassNotFoundExceptionの例外処理を記述する必要があります。

なお、リフレクションに関連する例外の共通クラスReflectiveOperationExceptionで処理することも可能です。

インスタンスの生成

インスタンスを生成する記述は以下のとおりになります。

これは、

に相当します。

メソッドの取得と実行

メソッドを取得するにはMethodクラスのオブジェクトにgetMethodメソッドの戻り値を格納します。

getMethodメソッドの第2引数以降はClassクラスの可変長引数になります。

メソッドを実行するためにはinvokeメソッドを実行します。

invokeメソッドの第2引数以降は可変長引数になります。

サンプルコードで確認しましょう。

実行結果:

このサンプルコードでは、クラス名とメソッド名をそれぞれString型の変数に格納しています。

クラス名やメソッド名を格納した変数をforNameメソッドgetMethodメソッドinvokeメソッドなどのメソッドの引数に指定して実行しています。

privateフィールドの参照と変更

ここではprivateフィールドの参照と変更の方法について見ていきましょう以下のサンプルコードで確認しましょう。

実行結果:

このサンプルコードでは、まずstrMethod1で指定されたメソッドでフィールドに値を書き込んでいます。

その値をFieldクラスのオブジェクトfから呼び出されたgetメソッドを使って取得しています。また、その値をオブジェクトfから呼び出されたsetメソッドを使って変更しています。

リフレクションの危険性について

リフレクションを使用する場合は以下のことに注意しましょう。

クラス設計を破壊する危険性

これまでお伝えしたように、アクセス修飾子privateで「カプセル化」した値を、直接取得・変更することができました。

このように直接操作することを可能にしてしまうため、リフレクションには既存のクラス設計を破壊してしまう危険性があります。

コンパイル時にエラーの検出対象外

以前はリフレクションを使用した部分のコードは、コンパイル時のエラー検出対象外でエラーを検出させることができませんでした。

リフレクション部分のエラーはプログラム実行時にのみ検出するしかありませんでした。

しかし、Java7以降ではReflectiveOperationExceptionでリフレクションに関連する例外の共通クラスが定義されたため、例外処理を記述できるようになりました。

まとめ

ここでは、リフレクションについて説明しました。

リフレクションを使って記述すれば、後はクラス名やメソッド名など変数に代入する値を変更するだけで異なるクラスやメソッドを実行することができます。プログラムをテストする場合などで使用すると便利です。

使いこなすことができるように、この記事を何度も参考にして下さいね!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説