ホームページ >Java >&#&チュートリアル >Javaのリフレクション機構を詳しく解説

Javaのリフレクション機構を詳しく解説

黄舟
黄舟オリジナル
2017-10-16 10:19:261197ブラウズ

この記事では、Java リフレクション メカニズムの詳細な例の関連情報を主に紹介します。この記事が、リフレクション メカニズムを理解して習得するのに役立つことを願っています。

Java リフレクション メカニズムの詳細な例

。はじめに

今日はJavaのリフレクション機構を紹介します。以前はクラスのインスタンスを取得するためにnewを使用していました。それは低すぎます。それを達成するためのより高度な方法を学ぶために、今日私と一緒に来てください。

Text

Java リフレクション メカニズムの定義

Java リフレクション メカニズムは、実行状態では、任意のクラス、このクラスのすべてのプロパティとメソッドを任意のオブジェクトに対して認識でき、任意のメソッドとメソッドを呼び出すことができることを意味します。この動的に取得される情報とオブジェクトのメソッドを動的に呼び出す機能をJava言語のリフレクション機構と呼びます。 一言でまとめると、リフレクションは実行時に任意のクラスのプロパティとメソッドを実現できます。

反映メカニズムの長所と短所

なぜ反映メカニズムを使用するのですか?オブジェクトを直接作成するだけでは十分ではないでしょうか? これには、動的と静的の概念が含まれます。

静的コンパイル: コンパイル時に型を決定し、オブジェクトをバインドします。つまり、渡します。

動的コンパイル: 実行時に型を決定し、オブジェクトをバインドします。動的コンパイルは Java の柔軟性を最大限に高め、ポ​​リモーフィックなアプリケーションを具体化し、クラス間の結合を軽減します。

利点

は、オブジェクトの動的な作成とコンパイルを実現でき、優れた柔軟性を示します。特に J2EE の開発において、その柔軟性は非常に明白です。たとえば、大規模なソフトウェアの場合、一度に完璧に設計することは不可能です。プログラムをコンパイルしてリリースした後、特定の機能を更新する必要があることが判明した場合、ユーザーに以前のソフトウェアをアンインストールするように求めることはできません。新しいバージョンを再インストールすると、このソフトウェアは多くの人に使用されなくなります。静的な場合、機能の更新を実現するためにプログラム全体を一度再コンパイルする必要があります。反映メカニズムを使用する場合、機能を実現するために動的に作成およびコンパイルするだけで済みます。

欠点

パフォーマンスに影響します。リフレクションの使用は基本的に解釈された操作であり、JVM に何をしたいかを伝えることができ、それが要件を満たします。このような操作は、同じ操作を直接実行するよりも常に遅くなります。


Classクラスとクラス型を理解する

リフレクションを理解したい場合は、まずリフレクション実装の基礎となるClassクラスを理解してください。


クラスは java.lang.Class クラスのインスタンス オブジェクトであり、Class はすべてのクラスのクラスです (通常のオブジェクトの場合、通常は次のように作成して表現します:

)。


Code code1 = new Code();

上 とはいえ、すべてのクラスはClassのオブジェクトなので、どう表現するかというと、次のように表現できますか:


Class c = new Class();

ですが、Classのソースコードを見ると、次のように記述します:

private Class(ClassLoader loader) { 
classLoader = loader; 
}

Yes コンストラクターがプライベートであることを確認してください。したがって、通常のクラスのように Class オブジェクトを作成することはできませんが、取得することはできます。既存のクラスを介して Class オブジェクトを共有する 以下の 3 つの方法:

Class c1 = Code.class;

これは、どのクラスにも暗黙的な静的メンバー変数クラスがあることを示しています


Class c2 = code1.getClass();

code1 Codeのオブジェクトです。このメソッドは、クラスオブジェクトのgetClass()メソッドを通じて取得されます。このメソッドは、ClassクラスがforNameメソッドを呼び出して取得されます。クラスの完全修飾名。ここで、c1、c2、および c3 はすべて Class のオブジェクトであり、Code のクラス タイプと呼ばれる学名が付いています。 これはおかしいです。Code は Class のオブジェクトであり、c1、c2、c3 も Class のオブジェクトであると言いませんでしたか。つまり、Code は c1、c2、c3 と同じではないでしょうか。なぜコードとも呼ばれるのですか?また、どのような種類のクラスですか?ここでは、それらが同じであるかどうかにこだわる必要はありません。クラス型が何をするのかを理解してください。名前が示すように、クラス型はクラスの型です。つまり、クラスが何であるか、およびクラスに何が含まれているかを説明します。 、したがって、クラスのプロパティとメソッドを通じてクラスを知ることができ、クラスのプロパティとメソッドを呼び出すことができます。これがリフレクションの基礎です。

簡単なコード例:


Class c3 = Class.forName(“com.trigl.reflect.Code”);

実行結果:

public class ReflectDemo { 
public static void main(String[] args) throws ClassNotFoundException { 
//第一种:Class c1 = Code.class; 
Class class1=ReflectDemo.class; 
System.out.println(class1.getName());

  //第二种:Class c2 = code1.getClass();
  ReflectDemo demo2= new ReflectDemo();
  Class c2 = demo2.getClass();
  System.out.println(c2.getName());

  //第三种:Class c3 = Class.forName("com.trigl.reflect.Code");
  Class class3 = Class.forName("com.tengj.reflect.ReflectDemo");
  System.out.println(class3.getName());
}
}


Javaリフレクション関連の操作

前にクラスを取得する方法はわかったので、このクラスで何ができるでしょうか?


概要は以下の通りです:

メンバーメソッドの取得 Method メンバー変数 Field の取得

コンストラクター Constructor の取得


以下、詳しく紹介します

メンバーメソッド情報の取得


特定のメソッドを個別に取得する

com.tengj.reflect.ReflectDemo 
com.tengj.reflect.ReflectDemo 
com.tengj.reflect.ReflectDemo
の Class クラスの次のメソッドを通じて取得されます。

以上がJavaのリフレクション機構を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。