Java リフレクションの分析の概要
このドキュメントでは Java リフレクションの分析と導入について説明します
1. リフレクションとは何ですか?
Baidu Encyclopedia を通じて、どのクラスについても、そのクラスのすべてのプロパティとメソッドを知ることができ、そのメソッドとプロパティを呼び出すことができます。そのプロパティを変更します。これが、Java が動的 (または準動的) とみなされている理由です。動的言語の一般的な定義では、プログラムの実行中にプログラムの構造または変数の型を変更することができます。この言語は動的言語と呼ばれます。この観点から、Perl、Python、および Ruby は動的言語であり、C++、Java、および C# は動的言語ではありません。) 言語の重要なプロパティ。
2. リフレクションで何ができるでしょうか?
リフレクションメカニズムにより、プログラムは実行時に既知の名前を持つクラスの修飾子 (修飾子)、フィールド (プロパティ)、メソッド (メソッド) などの内部情報を取得し、その内容を変更できることがわかっています。または実行時にメソッドを呼び出します。そうすれば、より柔軟にコードを書くことができ、コンポーネント間のソースコードのリンクを必要とせずにコードを実行時にアセンブルできるため、コードの結合が軽減されます。ただし、注意が必要です。リフレクションを不適切に使用すると、非常にコストがかかります。
3. リフレクションの具体的な実装
以下は基本クラス person
package com.ys.reflex; public class Person { //私有属性 private String name = "Tom"; //公有属性 public int age = 18; //构造方法 public Person() { } //私有方法 private void say(){ System.out.println("private say()..."); } //公有方法 public void work(){ System.out.println("public work()..."); } }
① Class
//1、通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object // 类型的对象,而我不知道你具体是什么类,用这种方法 Person p1 = new Person(); Class c1 = p1.getClass(); //2、直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高 // 这说明任何一个类都有一个隐含的静态成员变量 class Class c2 = Person.class; //3、通过 Class 对象的 forName() 静态方法来获取,用的最多, // 但可能抛出 ClassNotFoundException 异常 Class c3 = Class.forName("com.ys.reflex.Person");
を取得する3つの方法であることに注意してください: クラスはThereのみになります。はクラスインスタンスですつまり、上記で取得したc1、c2、c3を等しいものと比較し、それらがすべて真であることを確認します
②, メンバー変数、メンバーメソッド、インターフェイス、スーパークラス、およびClass クラスを介したコンストラクター 待ってください
API を確認すると、Class に多くのメソッドがあることがわかります:
getName(): クラスの完全な名前を取得します。
getFields(): クラスのパブリック型属性を取得します。
getDeclaredFields(): クラスのすべての属性を取得します。プライベート宣言クラスと継承クラスを含む
getMethods(): クラスのパブリック型メソッドを取得します。
getDeclaredMethods(): クラスのすべてのメソッドを取得します。プライベート宣言クラスと継承クラスを含む
getMethod(String name, Class[]parameterTypes): クラスの特定のメソッドを取得します。name パラメーターはメソッドの名前を指定し、parameterTypes パラメーターはメソッドのパラメーターの型を指定します。
getConstructors(): クラスのパブリック型コンストラクターを取得します。
getConstructor(Class[]parameterTypes): クラスの特定のコンストラクター メソッドを取得します。parameterTypes パラメーターは、コンストラクター メソッドのパラメーターの型を指定します。
NewInstance(): パラメータなしでクラスのコンストラクタメソッドを通じてこのクラスのオブジェクトを作成します。
上記の方法を包括的に説明するために例を使用します:
//获得类完整的名字 String className = c2.getName(); System.out.println(className);//输出com.ys.reflex.Person //获得类的public类型的属性。 Field[] fields = c2.getFields(); for(Field field : fields){ System.out.println(field.getName());//age } //获得类的所有属性。包括私有的和继承类的 Field [] allFields = c2.getDeclaredFields(); for(Field field : allFields){ System.out.println(field.getName());//name age } //获得类的public类型的方法。这里包括 Object 类的一些方法 Method [] methods = c2.getMethods(); for(Method method : methods){ System.out.println(method.getName());//work waid equls toString hashCode等 } //获得类的所有方法。 Method [] allMethods = c2.getDeclaredMethods(); for(Method method : allMethods){ System.out.println(method.getName());//work say } //获得指定的属性 Field f1 = c2.getField("age"); System.out.println(f1); //获得指定的私有属性 Field f2 = c2.getDeclaredField("name"); //启用和禁用访问安全检查的开关,值为 true,则表示反射的对象在使用时应该取消 java 语言的访问检查;反之不取消 f2.setAccessible(true); System.out.println(f2); //创建这个类的一个对象 Object p2 = c2.newInstance(); //将 p2 对象的 f2 属性赋值为 Bob,f2 属性即为 私有属性 name f2.set(p2,"Bob"); //使用反射机制可以打破封装性,导致了java对象的属性不安全。 System.out.println(f2.get(p2)); //Bob //获取构造方法 Constructor [] constructors = c2.getConstructors(); for(Constructor constructor : constructors){ System.out.println(constructor.toString());//public com.ys.reflex.Person() }
IV. リフレクションの概要
JDBC ネイティブ コード登録ドライバー、休止状態エンティティ クラス、Spring の AOP など、リフレクションを柔軟に使用することで、コードをより柔軟にすることができます。すべてにリフレクション実装があります。しかし、すべてのものには 2 つの側面があります。反射によってシステムのパフォーマンスと複雑さも増大します。それは合理的な使用であるということです。
以上が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 クラスはクラスのバイトを表します。

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

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

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