ホームページ  >  記事  >  Java  >  JAVA でのリフレクション

JAVA でのリフレクション

WBOY
WBOYオリジナル
2024-08-30 15:57:54855ブラウズ

リフレクションは、その名前が示すように、クラスのランタイム インスタンスを完全に検査できる Java の API (アプリケーション プログラミング インターフェイス) 機能です。これは Java.lang.reflect パッケージの一部です。このパッケージはプログラムの開始時にインポートする必要があり、その後、「リフレクション」の機能を理解するために関数が呼び出されます。どのクラスの行動も研究できます。メタデータは、実行時にリフレクション API を使用して抽出または変更できます。

無料ソフトウェア開発コースを始めましょう

Web 開発、プログラミング言語、ソフトウェア テスト、その他

構文

クラス情報を抽出するためのリフレクション API での一般的な関数の構文を以下に示します。

  • public String getName(parameter ): この関数はクラス名を返します。
  • public boolean isInterface(parameter ): この関数は、クラスがインターフェースであるかどうかをチェックし、ブール値 (true または false) を返します。
  • public boolean isArray(parameter ): この関数は、変数が配列であるかどうかをチェックし、ブール値 (true または false) を返します。
  • public Constructor[] getDeclaredConstructors(parameter) throws SecurityException: この関数は、クラス内のコンストラクターをチェックし、特定のクラスで使用されているコンストラクターの数を返します。さらに、プログラムをブレークフリーで動作させることに関連するセキュリティ例外とキャッチもあります。
  • public Method[] getDeclaredMethods(parameter) throws SecurityException: この関数は、クラス内のメソッドをチェックし、特定のクラスで使用されているメソッドの数を返します。さらに、プログラムを問題なく動作させるために、セキュリティ例外とキャッチが関連付けられています。
  • public Class getSuperclass(parameter ): この関数は、基本クラスのスーパークラスを返します。
  • public boolean is primitive(parameter ): この関数は、指定されたパラメータがプリミティブかどうかをチェックし、ブール値を返します。

JAVA ではリフレクションはどのように機能しますか?

リフレクション クラスは、Java.lang.reflect パッケージで定義されたさまざまなメソッドを使用してクラス情報を抽出します。クラスに関する情報は getClass() メソッドを使用して抽出でき、コンストラクターは getConstructors() メソッドを使用して、メソッドは getMethods() メソッドを使用して抽出できます。これらのメソッドはリフレクション API で定義されていますが、メソッド、コンストラクターなどを含むクラスの情報を返します。 Reflection API は、JAVA プログラム、Eclipse などの IDE (統合開発環境)、Netbeans で使用されます。これは、以下のセクションで提供される例を参照するとよく理解できます。

JAVA でのリフレクションの例

さまざまな例を以下に示します:

例 #1

コード:

//package test;
import java.lang.Class;
public class test{
public static void main(String args[]){
Class<Boolean> c1 = boolean.class;
System.out.println("Here, the class name is: "+c1.getName());
Class<test> c2 = test.class;
System.out.println("This is another instance of class is used to derive class name : "+c2.getName());
}
}

出力:

JAVA でのリフレクション

説明: 上記の例を確認してください。これには、「test」という名前のすべてのクラスが含まれるパッケージがあります。テスト パッケージには「テスト宣言」クラスがあります。このクラスには、プログラムの実行を開始する main メソッドも含まれています。クラス「Class 」 jAVA の識別子リフレクション クラスです。このクラスは、「java.lang.Class」上で宣言されたライブラリの助けを借りて有効になります。 Boolean 自体は Java のクラスです。ブール値は、string、int、char のようなプリミティブ データ型です。この例は、プリミティブ データ型 (最終的には JAVA のクラス) の情報を抽出できることを示しています。これが、JAVA が純粋なオブジェクト指向言語と呼ばれる理由です。名前を取得するには、「 getName() 」関数が使用されます。ここでは「C1」という名前のオブジェクトによってインスタンス化されるクラスの。

次の行では、プリミティブ データ型を使用するのではなく、「test」という名前のユーザー定義データ型「クラス」を考慮してデータを抽出しています。 「授業」 「C2」という名前のオブジェクトでインスタンス化されるリフレクション クラスです。ここではクラス名がテストされ、関数「getName()」を使用してこのクラスの名前を取得するためにオブジェクトが使用されます。最終出力にはこれらの関数の戻り値が含まれており、出力画面に表示されます。

例 #2

コード:

//package test;
import java.lang.Class;
class Simple{}
public class test{
public static void main(String args[]){
try{
Class<?> c=Class.<em>forName</em>("Simple");
System.<em>out</em>.println("The result is: "+c.isInterface());
}catch(Exception e){System.<em>out</em>.println(e);}
}
}

出力:

JAVA でのリフレクション

説明: 上の例では、前の例 1 で作成したように、「test」という名前のパッケージが作成されます。このパッケージには、メイン クラスではないクラス名「Simple」が含まれています。 。ここでのメインクラスは、プログラムの実行を開始するメインメソッドを含む「test」クラスです。 「クラス 」ここでは「c」という名前のオブジェクトを介してインスタンス化されたリフレクション クラスの識別子です。次に、このオブジェクトを使用して、「isInaterface」という名前の関数の決定インジケーター (True または false) を取り出します。この関数はクラスをパラメータとして取得します。この場合、パラメータとして引き込まれたクラスは「Simple」クラスです。このクラスはインターフェースではないため、出力画面では結果として「false」が返されます。この関数を呼び出すには、クラス オブジェクト「c」が使用されました。

メリット

JAVA でリフレクションを使用する利点のいくつかを以下に示します。

  1. これは、あらゆるクラスの情報を抽出する最良の方法の 1 つです。この情報は、コンストラクターからクラス、メソッドまでの情報で構成されます。
  2. この機能の最大の利点の 1 つは、プライベート メソッドとクラスに関する情報も抽出できることです。したがって、悪意を持ってプログラムに隠されたものはすべて、この機能を使用して取り出すことができます。
  3. この機能により、デバッガはすべてのクラスを個別に実行するのではなく、クラスを簡単にデバッグできるため、非常に柔軟性が高まります。
  4. これは、インスタンスを使用して外部のカスタマイズされたクラスを追加できる拡張機能としても追加されます。
  5. これは、インスタンスの助けを借りて OOP 言語の真の力を表現します。
  6. これは、プログラム実行中のクラスの動的ロードおよび再ロードで使用されます。

結論

JAVA リフレクションを使用すると、クラス名をまったく知らなくても、クラス、インターフェイス、メソッドなどをイントロスペクトできます。これはすべてコンパイル時に行われます。これは、クラスのインスタンスの作成に使用でき、これを使用してクラスのプライベート メンバーを抽出できるため、JAVA の最も強力なプロパティの 1 つと考えられています。開発者はこれを実行時やデータベースとオブジェクトのマッピングにも使用できます。

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

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