Java リフレクションとは何ですか? Java リフレクション メカニズムの詳細な紹介
この記事では、Java リフレクションとは何ですか? Java リフレクション メカニズムの詳細な紹介は、参考になると思います。
1. 概念
Java リフレクション (Reflection) とは、Java プログラムの実行中に、名前だけがわかっているクラスをロードし、そのクラスの完全な構築メソッドを取得できることを意味します。オブジェクトをインスタンス化して、オブジェクトのプロパティに値を設定するか、オブジェクトのメソッドを呼び出します。この動的にクラス情報を取得し、実行時にオブジェクトのメソッドを動的に呼び出す機能をJavaのリフレクション機構と呼びます。
2. クラス クラス
Class クラスは Object クラスを継承し、クラスまたはインターフェイスの実行時情報をカプセル化して呼び出して取得できます。 Class クラスのメソッド。この Class クラスを理解するにはどうすればよいでしょうか?通常のクラスがすべてのオブジェクトのメソッドと属性のコレクションである場合、この Class クラスはすべての通常のクラスのコレクションとして理解できます。
Class クラスを取得するいくつかの方法は次のとおりです:
public class TestClass { public static void main(String[] args) throws ClassNotFoundException { // 1、 Class.forName(); Class<?> aClass0 = Class.forName("java.lang.Object"); // 2、类名.Class Class<Integer> aClass1 = Integer.class; // 3、包装类.TYPE —— 返回基本类型的 Class 引用,基本类型在虚拟机运行时就已经加载了它的Class Class<Integer> aClass2 = Integer.TYPE; // 4、对象名.getClass() String str = "Hello, World"; Class<? extends String> aClass3 = str.getClass(); // 5、Class类.getSuperClass() —— 获得父类的 Class 对象 Class<?> aClass4 = aClass3.getSuperclass(); System.out.println(aClass0.getName()); System.out.println(aClass1.getName()); System.out.println(aClass2.getName()); System.out.println(aClass3.getName()); System.out.println(aClass4.getName()); } }
3. クラス情報の取得
Java のリフレクション メカニズムをテストするために、新しいペアを作成しました。親クラスと子クラスの 4 つのカプセル化プロパティをカバーし、可能な限り複数の種類の情報の取得をテストします。
Vehicle.java
vpublic class Vehicle { private String color; protected Integer seat; int year; public Date createdOn; private String getColor() { return color; } protected Integer getSeat() { return seat; } int getYear() { return year; } public Date getCreatedOn() { return createdOn; } }
Car.java
public class Car extends Vehicle { private String brand; protected Integer a; int b; public Date updatedOn; public Car(){} private Car(String brand, Integer a, int b, Date updatedOn) { this.brand = brand; this.a = a; this.b = b; this.updatedOn = updatedOn; } private String getBrand() { return brand; } protected Integer getA() { return a; } int getB() { return b; } public Date getUpdatedOn() { return updatedOn; } }
1. メソッドの取得
クラス クラスは、主に次の 2 つの方法でメソッドを取得します。
Method[] getMethods() は、アクセス可能なすべてのパブリック メソッドを返します。クラスまたはインターフェイス (継承されたパブリック メソッドを含む)。
Method[] getDeclaredMethods() このクラスまたはインターフェイスのすべてのメソッドを返します(継承されたメソッドを除く)。
public class TestMethod { public static void main(String[] args) { Class<Car> carClass = Car.class; Method[] methods = carClass.getMethods(); Method[] declaredMethods = carClass.getDeclaredMethods(); for (Method method : methods) { //for (Method method : declaredMethods) { System.out.println("方法名:" + method.getName()); System.out.println("该方法所在的类或接口:" + method.getDeclaringClass()); System.out.println("该方法的参数列表:" + method.getParameterTypes()); System.out.println("该方法的异常列表:" + method.getExceptionTypes()); System.out.println("该方法的返回值类型:" + method.getReturnType()); } } }
2. 属性の取得
クラス クラスは主に次の 2 つのメソッドで属性を取得します。
Field[] getFields(): storage すべてアクセス可能このクラスまたはインターフェイスのパブリック プロパティ (継承されたパブリック プロパティを含む)。
Field[] getDeclaredFields(): クラスまたはインターフェイスのすべてのプロパティ (継承されたプロパティを除く) を格納します。
public class TestField { public static void main(String[] args) { Class<Car> carClass = Car.class; Field[] fields = carClass.getFields(); Field[] declaredFields = carClass.getDeclaredFields(); //for (Field field : fields) { for (Field field : declaredFields) { System.out.println("属性名称是:" + field.getName()); System.out.println("该属性所在的类或接口是:" + field.getDeclaringClass()); System.out.println("该属性的类型是:" + field.getType()); // field.getModifiers() 以整数形式返回由此 Field 对象表示的属性的 Java 访问权限修饰符 System.out.println("该属性的修饰符是:" + Modifier.toString(field.getModifiers())); } } }
3. コンストラクターの取得
Class クラスは主に次の 2 つの方法でコンストラクター メソッドを取得します。 ] getConstructors(): クラスまたはインターフェイスのすべてのパブリック コンストラクターを返します。
Constructor>[] getDeclaredConstructors(): クラスまたはインターフェイスのすべてのコンストラクターを返します。
public class TestConstructor { public static void main(String[] args) throws NoSuchMethodException { Class<Car> carClass = Car.class; Constructor<?>[] constructors = carClass.getConstructors(); Constructor<?>[] declaredConstructors = carClass.getDeclaredConstructors(); Constructor<Car> carConstructor = carClass.getDeclaredConstructor(String.class, Integer.class, Integer.TYPE, Date.class); //for (Constructor constructor : declaredConstructors) { for (Constructor constructor : constructors) { System.out.println("该构造器的名称是:" + constructor.getName()); System.out.println("该构造器所在的类或接口是:" + constructor.getDeclaringClass()); //返回构造方法的参数类型 constructor.getParameterTypes(); } } }
four 、動的呼び出し
これまで、Class クラスのメソッドを通じて、対応するクラスの属性、メソッド、コンストラクターの詳細情報を取得しました。次に、この情報を使用してオブジェクトを動的に作成し、プロパティを変更し、メソッドを動的に呼び出します。
rree以上がJava リフレクションとは何ですか? Java リフレクション メカニズムの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

Java リフレクションは、クラスのプライベート フィールドやメソッドにアクセスできるようにする強力なツールであり、それによってソフトウェアの内部動作を明らかにします。これは、リバース エンジニアリング、ソフトウェア分析、デバッグなどの分野で役立ちます。 Java リフレクションを使用するには、まず java.lang.reflect パッケージをインポートする必要があります。次に、 Class.forName() メソッドを使用して、クラスの Class オブジェクトを取得できます。 Class オブジェクトを取得すると、さまざまなメソッドを使用してクラスのフィールドやメソッドにアクセスできます。たとえば、getDeclaredFields() メソッドを使用すると、プライベート フィールドを含むクラスのすべてのフィールドを取得できます。 getDeclaredMethods() メソッドを使用することもできます。

取得方法: 1. サンプル オブジェクトを作成します; 2. field.get(person) を通じてフィールドの値を取得します (person はサンプル オブジェクト、field はフィールドを表す Field オブジェクトです); 3. setAccessible を通じてフィールドを設定します(true) アクセス可能な状態では、プライベート フィールドでも値を取得できます; 4. フィールド配列を走査し、各フィールドの名前と対応する値を取得し、出力します。

Java リフレクション メカニズムの原理は、バイトコード ファイルがメモリにロードされると、jvm がバイトコードを分析し、そのオブジェクトの Class オブジェクトを作成することです。jvm は、すべてのバイトコード ファイル情報を Class オブジェクトに保存します。 Class オブジェクトを取得すると、そのオブジェクトを使用して、オブジェクトのプロパティやメソッドなどを設定できます。リフレクション機構は、実行状態にある任意のクラスの属性とメソッドをすべて把握する機能であり、任意のオブジェクトに対して、その属性とメソッドを呼び出し、動的に情報を取得し、動的にオブジェクトのメソッドを呼び出すことができます。

Java リフレクション メカニズムを通じてオブジェクトを作成する手順は次のとおりです。 ターゲット クラスをロードします。 Class.forName() メソッドを使用します。コンストラクターを取得します。 getDeclaredConstructor() メソッドを使用します。オブジェクトを作成します。 newInstance() メソッドを使用してパラメータを渡します。

Java リフレクション メカニズムの原理と応用についての深い理解 1. リフレクション メカニズムの概念と原理 リフレクション メカニズムとは、動的にクラス情報を取得し、クラス メンバー (プロパティ、メソッド、コンストラクターなど) にアクセスして操作する機能を指します。プログラムが実行中です。リフレクション メカニズムを使用すると、コンパイル時にクラスの特定の情報を知らなくても、プログラムの実行中にオブジェクトを動的に作成したり、メソッドを呼び出したり、プロパティにアクセスしたりできます。リフレクション メカニズムの中核は、java.lang.reflect パッケージ内のクラスとインターフェイスです。このうち、Class クラスはクラスのバイトを表します。

Java の NoSuchFieldException 例外は、リフレクション中に存在しないフィールド (Field) にアクセスしようとしたときにスローされる例外を指します。 Java では、リフレクションを使用すると、コードを通じてプログラム内のクラス、メソッド、変数などを操作できるため、プログラムがより柔軟でスケーラブルになります。ただし、リフレクションを使用する場合、アクセスされたフィールドが存在しない場合は、NoSuchFieldException がスローされます。 NoSuchFieldException

Java リフレクション呼び出しメソッドは次のとおりです: 1. クラス クラス; 2. コンストラクター クラス; 3. メソッド クラス; 4. フィールド クラス; 5. ClassLoader クラス。詳細な紹介: 1. クラス クラス。クラス名、メンバー変数、メソッドなどを含むクラス情報を取得するために使用されます。クラス クラスの "newInstance()" メソッドを通じてクラスのインスタンスを作成できます。 2. コンストラクター クラス、コンストラクターのパラメーターの型、修飾子、戻り値の型、その他の情報などを取得するために使用されます。

取得方法: 1. Person クラスを作成し、リフレクションを通じてクラスの Class オブジェクトを取得します; 2. getDeclaredFields メソッドを使用して、クラスのすべてのフィールドを取得します; 3. フィールド配列をトラバースして、フィールドをアクセス可能な状態に設定します。このメソッドはフィールドの値を取得し、フィールド名と値を出力します。
