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

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

巴扎黑
巴扎黑オリジナル
2017-06-27 09:19:331378ブラウズ

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 までご連絡ください。