ホームページ Java &#&チュートリアル Javaチュートリアル -- 基本的な強化_リフレクション

Javaチュートリアル -- 基本的な強化_リフレクション

Jun 27, 2017 am 09:19 AM
強化する 反射 ベース

JavaBean:データベースのテーブルとエンティティクラスの対応
1. データベースにテーブルがあれば、そのテーブルに対応するクラスが存在します
データベース: パーソンテーブル Java: プレソンクラス
2. テーブルの各列が対応Java A フィールド (メンバー変数)
3. テーブルの各行は Java のオブジェクトに対応します
Zhang San 18 の男性の新しい人物 (Zhang San 18 の男性);
Xiaohua 18 の女性の新しい人物(Xiaohua 18 の女性);
その他のオブジェクトコレクション ArrayList に配置できます

JavaBean には以下が含まれます:
1. プライベート メンバー変数
2. パブリック getter/setter メソッド
3. 空のパラメーター構築メソッド
4. toString メソッド
5. シリアル化インターフェイスの実装

クラス ファイル オブジェクトを取得する 3 つの方法:
1. オブジェクト クラス
Class getClass() のメソッド getClass() を使用して、このオブジェクトのランタイム クラスを返します。
2. クラス名.class 属性を使用します
各データ型、基本データ型、および参照データ型に対して、Java はクラス属性を設定します
Class clazz = int.class
Class clazz = String.class
Class clazz = Person .class
3. Class クラスで静的メソッド forName
を使用します。 static Class forName(String className)
指定された文字列名のクラスまたはインターフェイスに関連付けられた Class オブジェクトを返します。

注: 各クラスのクラス ファイル オブジェクトは 1 回だけ生成され、一意です

リフレクション テクノロジを使用してクラス内のコンストラクターを取得し、インスタンス化します
* public Person() {}
* public Person(String name, int age, String sex) {}
* private Person(String name, int age) {}
*
* 実装手順:
* 1. Person クラスのクラス ファイル オブジェクトを取得します
* 2. メソッド getConstructor を使用しますクラス ファイル オブジェクト コンストラクター メソッドを取得します
* 3. コンストラクターのメソッド newInstrance を使用して、コンストラクターをインスタンス化します


リフレクションを使用して空のパラメーター オブジェクトを作成する簡単な方法
* 使用の前提条件:
* 1.クラス内に空のパラメータを持つコンストラクタ メソッド
* 2 。空のパラメータを持つコンストラクタ メソッドの修飾子は public を使用することをお勧めします
*
* クラス class 内にメソッドがあります
* T newInstance()この Class オブジェクトによって表されるクラスの新しいインスタンスを作成します。
*

リフレクション技術を使用してクラス内のメンバー変数 (フィールド) を取得し、メンバー変数に値を代入して値を取得します
* private String name
* public String; sex;
*
* 実装手順:
* 1. Person クラスのクラス ファイル オブジェクトを取得します
* 2. クラス ファイル オブジェクトの getField メソッドを使用してメンバー変数を取得します
* 3. get/set メソッドを使用しますField でメンバー変数の値を取得し、メンバー変数に値を代入します

 1  public static void main(String[] args) throws Exception { 2         //1.获取Person类的class文件对象 3         Class clazz = Class.forName("cn.itcast.demo02.javabean.Person"); 4         //2.使用class文件对象中的方法getField获取成员变量 5         /* 6          *  Field[] getFields()  获取类中所有可访问公共字段。 7          *  Field[] getDeclaredFields()  获取类中所有的声明字段,包含私有的。 8          */ 9         Field[] fields1 = clazz.getFields();10         for (Field field : fields1) {11             System.out.println(field);12         }13         System.out.println("------------------");14         Field[] fields2 = clazz.getDeclaredFields();15         for (Field field : fields2) {16             System.out.println(field);17         }18         System.out.println("------------------");19         20         /*21          * Field getField(String name)  获取类中指定公共成员字段。22          * Field getDeclaredField(String name)  获取类中指定的声明字段,包含私有的。23          * 参数:24          *     String name:字段的名字25          */26         //public String sex;27         Field sexField = clazz.getField("sex");28         System.out.println(sexField);29         //private String name;30         Field nameField = clazz.getDeclaredField("name");31         System.out.println(nameField);32         //private int age;33         Field ageField = clazz.getDeclaredField("age");34         System.out.println(ageField);35         36         /*37          * 3.使用Field中的方法get/set获取成员变量值,给成员变量赋值38          * Object get(Object obj) 返回指定对象上此 Field 表示的字段的值。 
39          * void set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。40          * 参数:41          *     Object obj:要设置值/获取的值的对象,可以使用反射快速创建42          *     Object value:给成员变量设置的实际值43          * 返回值:44          *     Object:获取成员变量的返回值    
45          */46         //使用反射创建对象47         Object obj = clazz.newInstance();48         49         //public String sex;50         //get(obj);-->getSex();51         Object sexValue = sexField.get(obj);52         System.out.println(sexValue);//默认值 null53         54         /*55          * private String name;56          * 私有的属性无法直接使用,必须先取消Java的权限检查(暴力反射)57          */58         nameField.setAccessible(true);59         Object nameValue = nameField.get(obj);60         System.out.println(nameValue);//默认值 null61         62         //private int age;63         ageField.setAccessible(true);64         Object ageValue = ageField.get(obj);65         System.out.println(ageValue);//默认值 066         System.out.println("------------------");67         /*68          * 设置成员变量的值69          */70         //public String sex;71         sexField.set(obj, "妖");72         //获取值73         sexValue = sexField.get(obj);74         System.out.println(sexValue);//妖75         76         //private String name;77         nameField.set(obj, "泰国美女");78         //获取值79         nameValue = nameField.get(obj);80         System.out.println(nameValue);//泰国美女81         82         //private int age;83         ageField.set(obj, 18);84         //获取值85         ageValue = ageField.get(obj);86         System.out.println(ageValue);//1887         System.out.println(obj);//Person [name=泰国美女, age=18, sex=妖]88     }
ログイン後にコピー
リフレクション技術を使用してクラス内のメンバーメソッドを取得して実行します

* public String getName()
* public void setName(String name)
* private void method()
*
* 実装手順:
* 1. Person クラスのクラス ファイル オブジェクトを取得します
* 2. クラス ファイル オブジェクトのメソッド getMethod を使用して、メンバー メソッドを取得します
* 3. Method 内でメソッドを呼び出し、取得したメソッドを実行します
*
* Method クラスのメソッド: getName、メソッド名を取得します
* String getName() は、この Method オブジェクトによって表されるメソッド名を String 形式で返します。

 1 public static void main(String[] args) throws Exception { 2         //1.获取Person类的class文件对象 3         Class clazz = Class.forName("cn.itcast.demo02.javabean.Person"); 4         //2.使用class文件对象中的方法getMethod获取成员方法 5         /* 6          * Method[] getMethods() 获取类中所有的公共方法,包含继承父类的 7          * Method[] getDeclaredMethods() 包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 
 8          */ 9         Method[] methods1 = clazz.getMethods();10         for (Method method : methods1) {11             System.out.println(method);12         }13         System.out.println("----------------------");14         Method[] methods2 = clazz.getDeclaredMethods();15         for (Method method : methods2) {16             System.out.println(method.getName());17         }18         System.out.println("----------------------");19         /*20          *  Method getMethod(String name, Class<?>... parameterTypes) 获取类中指定公共成员方法。21          *  Method getDeclaredMethod(String name, Class<?>... parameterTypes) 获取类中指定的成员方法,包含私有的.22          *  参数:23          *      String name:方法的字符串名称24          *      Class<?>... parameterTypes:方法参数列表的class对象    
25          */26         //public String getName()27         Method getNameMethod = clazz.getMethod("getName");28         System.out.println(getNameMethod);29         30         //public void setName(String name)31         Method setNameMethod = clazz.getMethod("setName", String.class);32         System.out.println(setNameMethod);33         34         //private void method()35         Method privateMethod = clazz.getDeclaredMethod("method");36         System.out.println(privateMethod);37         38         /*39          * 3.使用Method中的方法invoke执行获取到的方法40          * Object invoke(Object obj, Object... args) 
41          * 参数:42          *     Object obj:要执行的方法的所属对象43          *     Object... args:执行方法,传递的实际参数44          * 返回值:45          *     Object:方法的返回值46          *     如果方法没有返回值,Object的值为null47          */48         Object obj = clazz.newInstance();49         50         //public String getName()51         Object v1 = getNameMethod.invoke(obj);52         System.out.println(v1);//成员变量 name的默认值:null53         54         //public void setName(String name)55         Object v2 = setNameMethod.invoke(obj, "楼上老宋");56         System.out.println(v2);57         58         v1 = getNameMethod.invoke(obj);59         System.out.println(v1);//成员变量 name的值:楼上老宋60         61         /*62          * private void method()63          * 使用暴力反射,取消Java的权限检查64          */65         privateMethod.setAccessible(true);66         privateMethod.invoke(obj);//私有方法67         68         System.out.println("-------------");69         //获取返回值为数组的方法70         Method arrMethod = clazz.getMethod("methodArr");71         Object v3 = arrMethod.invoke(obj);72         int[] arr = (int[]) v3;73         System.out.println(v3);74         System.out.println(arr);75         for (int i : arr) {76             System.out.println(i);77         }78     }
ログイン後にコピー
リフレクションの包括的なケース:

* リフレクション技術を通じて JavaBean オブジェクトを取得し、JavaBean メンバー変数に値を注入 (代入) します
*
* 実装手順:
* 1. JavaBean (ユーザー クラス) を作成します
* 2. data.properties 設定ファイルを作成し、メンバー変数の実際の値を設定します
* 3. IO+Properties コレクションを使用して設定ファイルを読み取り、ファイル内のデータをコレクションに保存します
* 4. を使用しますリフレクション テクノロジーを使用して JavaBeans オブジェクトを作成します
* 5. Properties コレクションをトラバースします
* 6. Properties コレクション キーを使用して setXXX メソッドを結合します
* 7. リフレクション テクノロジーを使用して setXXX メソッドを取得します
* 8. リフレクション テクノロジーを使用してsetXXXメソッドを使用してメンバー変数に値を注入します

 1 public static void main(String[] args) throws Exception { 2         //3.使用IO+Properties集合,读取配置文件,把文件中的数据保存到集合中 3         Properties prop = new Properties(); 4         prop.load(new FileReader("data.properties")); 5         //4.使用反射技术创建JavaBean对象 6         Class clazz = Class.forName("cn.itcast.demo02.javabean.User"); 7         Object obj = clazz.newInstance(); 8         //5.遍历Properties集合 9         Set<String> set = prop.stringPropertyNames();10         for (String key : set) {11             /*12              * 6.使用Properties集合key拼接setXXX方法13              * 类中的set方法:14              *     setId,setUsername,setPassword15              * 集合的key:16              *     id,username,password17              * 拼接的过程:18              *     1.固定的字符串:"set"19              *     2.获取key的首字母,变成大写20              *     3.获取key的其它字母21              */22             String methodName = "set"+key.substring(0, 1).toUpperCase()+key.substring(1);23             //System.out.println(methodName);24             25             //7.使用反射技术获取setXXX方法26             Method setMethod = clazz.getMethod(methodName, String.class);27             //8.使用反射技术执行setXXX方法,给成员变量注入值(集合的value值)28             setMethod.invoke(obj, prop.get(key));29             30             /*31              * 扩展:拼接getXXX方法32              */33             String getMethodName = "get"+key.substring(0, 1).toUpperCase()+key.substring(1);34             Method getMethod = clazz.getMethod(getMethodName);35             Object value = getMethod.invoke(obj);36             System.out.println(value);37         }38         System.out.println(obj);39     }
ログイン後にコピー
リフレクション技術を使用してインターフェイスを取得します

* Class[] getInterfaces()は、クラスによって実装されるインターフェイス、またはこのオブジェクトによって表されるインターフェイスを決定します

りー

以上がJavaチュートリアル -- 基本的な強化_リフレクションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Java でのインターフェイスと抽象クラスのリフレクション メカニズムの実装 Java でのインターフェイスと抽象クラスのリフレクション メカニズムの実装 May 02, 2024 pm 05:18 PM

リフレクション メカニズムを使用すると、プログラムは実行時にクラス情報を取得および変更できます。これを使用して、インターフェイスおよび抽象クラスのリフレクションを実装できます。 インターフェイス リフレクション: Class.forName() を通じてインターフェイス リフレクション オブジェクトを取得し、そのメタデータ (名前、メソッド、および) にアクセスします。分野) 。抽象クラスのリフレクション: インターフェイスと同様に、抽象クラスのリフレクション オブジェクトを取得し、そのメタデータと非抽象メソッドにアクセスできます。実際のケース: リフレクション メカニズムを使用して動的プロキシを実装し、プロキシ クラスを動的に作成することで実行時にインターフェイス メソッドへの呼び出しをインターセプトできます。

golang でリフレクションを使用してプライベート フィールドとメソッドにアクセスする方法 golang でリフレクションを使用してプライベート フィールドとメソッドにアクセスする方法 May 03, 2024 pm 12:15 PM

リフレクションを使用して、Go 言語のプライベート フィールドおよびメソッドにアクセスできます。 プライベート フィールドにアクセスするには、reflect.ValueOf() を通じて値のリフレクション値を取得し、次に FieldByName() を使用してフィールドのリフレクション値を取得し、 String() メソッドを使用してフィールドの値を出力します。プライベート メソッドを呼び出します。また、reflect.ValueOf() を通じて値のリフレクション値を取得し、次に MethodByName() を使用してメソッドのリフレクション値を取得し、最後に Call() メソッドを呼び出してメソッドを実行します。実際のケース: プライベート フィールドの値を変更し、リフレクションを通じてプライベート メソッドを呼び出して、オブジェクト コントロールと単体テスト カバレッジを実現します。

golangでリフレクションを使用して変数値を動的に変更する方法 golangでリフレクションを使用して変数値を動的に変更する方法 May 02, 2024 am 11:09 AM

Go 言語のリフレクションを使用すると、ブール値、整数、浮動小数点数、文字列の変更など、実行時に変数値を操作できます。変数の値を取得すると、SetBool、SetInt、SetFloat、および SetString メソッドを呼び出して変数を変更できます。たとえば、JSON 文字列を構造に解析し、リフレクションを使用して構造フィールドの値を変更できます。反映操作は遅く、変更不可能なフィールドは変更できないことに注意してください。構造フィールドの値を変更する場合、関連するフィールドは自動的に更新されない場合があります。

セキュリティ上の考慮事項と Golang リフレクションの最適なソリューション セキュリティ上の考慮事項と Golang リフレクションの最適なソリューション May 04, 2024 pm 04:48 PM

Reflection は Go の型チェックと変更機能を提供しますが、任意のコードの実行、型偽造、データ漏洩などのセキュリティ リスクがあります。ベスト プラクティスには、リフレクション権限や操作の制限、ホワイトリストまたはブラックリストの使用、入力の検証、セキュリティ ツールの使用が含まれます。実際には、リフレクションを安全に使用して型情報を検査できます。

Golang のリフレクションとアプリケーション シナリオの分析の概要 Golang のリフレクションとアプリケーション シナリオの分析の概要 Apr 03, 2024 pm 01:45 PM

Go 言語のリフレクション機能を使用すると、プログラムは実行時に型の構造を検査および変更できます。 Type、Value、reflect.Kindを使用することで、オブジェクトの型情報、フィールド値、メソッドを取得したり、オブジェクトの作成や変更を行うこともできます。具体的な操作方法としては、型の確認(TypeOf())、フィールド値の取得(ValueOf()、FieldByName())、フィールド値の変更(Set())、オブジェクトの作成(New())などがあります。

golang でリフレクションを使用して新しい型を作成する方法 golang でリフレクションを使用して新しい型を作成する方法 May 01, 2024 am 09:21 AM

Go では、リフレクションを使用して新しい型を作成できます。 1. 既存の型の Reflect.Type 値を取得するには、reflect.New() を使用します。 3. *Ptr.Elem() を使用して実際の値にアクセスします。 4. リフレクションは、柔軟で動的なプログラムを構築するために使用される文字列に基づいて新しい型を動的に作成することもできます。

メソッドのオーバーロードに Java リフレクション メカニズムを使用しますか? メソッドのオーバーロードに Java リフレクション メカニズムを使用しますか? Apr 15, 2024 pm 10:54 PM

リフレクション メカニズムは、Java でメソッドのオーバーロードを実装するために使用されます。 リフレクションを通じてメソッドを取得します。 getMethod() メソッドを使用してメソッド オブジェクトを取得し、メソッド名とパラメータのタイプを指定します。メソッドの呼び出し: invoke() メソッドを使用してメソッドを呼び出し、呼び出し元のオブジェクトとパラメーター値を指定します。

反射光: Go 言語でのメソッドの動的呼び出しの探索 反射光: Go 言語でのメソッドの動的呼び出しの探索 Apr 08, 2024 am 10:00 AM

リフレクションは、プログラムがメソッドを動的に呼び出すことを可能にする Go 言語の強力なツールです。具体的な手順は次のとおりです。 メソッド メタデータを取得する (reflect.Method) メソッド タイプを取得する (reflect.Value) メソッド タイプを使用してメソッドを動的に呼び出す (reflect.Func.Call) リフレクションは、動的メソッド スケジューリング、単体テスト、およびコード生成に使用できます。ただし、リフレクションは動作が遅いため、型チェックに注意して使用する必要があります。

See all articles