Heim  >  Artikel  >  Java  >  Java-Tutorial – Grundlegende Stärkung_Reflexion

Java-Tutorial – Grundlegende Stärkung_Reflexion

巴扎黑
巴扎黑Original
2017-06-27 09:19:331378Durchsuche

JavaBean: Korrespondenz zwischen Datenbanktabellen und Entitätsklassen
1. Wenn es eine Tabelle in der Datenbank gibt, gibt es eine Klasse, die der Tabelle entspricht
Datenbank: Personentabelle Java: Preson-Klasse
2 . Tabelle Jede Spalte in der Tabelle entspricht einem Feld (Mitgliedsvariable) in Java
3. Jede Zeile in der Tabelle entspricht einem Objekt in Java
Zhang San 18 männlich neue Person (Zhang San 18 männlich); 🎜 > Xiaohua 18 weiblich, neue Person (Xiaohua 18 weiblich);
Mehrere Objekte können in einer Sammlung platziert werden. ArrayList

JavaBean enthält:
1. Private Mitgliedsvariablen
2. Öffentliche Getter/Setter-Methoden
3. Leere Parameterkonstruktionsmethode
4. toString-Methode
5. Serialisierungsschnittstelle implementieren

Drei Möglichkeiten, Klassendateiobjekte zu erhalten:
1. Verwenden Sie die method getClass()
Class in der Object-Klasse, um die Laufzeitklasse dieses Objekts zurückzugeben.
2. Verwenden Sie das Klassenname.Klasse-Attribut
Für jeden Datentyp, Basisdatentyp und Referenzdatentyp legt Java ein Klassenattribut dafür fest
Klasse clazz = int.class
Klasse clazz = String.class
Klasse clazz = Person.class
3. Verwenden Sie die statische Methode forName
in der Klasse class static Class forName(String className)
, um die angegebene Zeichenfolge zurückzugeben Klassenobjekt, das der benannten Klasse oder Schnittstelle zugeordnet ist.

Hinweis: Das Klassendateiobjekt jeder Klasse wird nur einmal generiert und ist einzigartig

Verwenden Sie die Reflexionstechnologie, um den Konstruktor in der Klasse abzurufen und zu instanziieren
* public Person() { } } 1. Rufen Sie das Klassendateiobjekt der Personenklasse
ab. * 2. Verwenden Sie die Methode getConstructor im Klassendateiobjekt, um die Konstruktionsmethode
abzurufen. * 3. Verwenden Sie die Methode newInstrance im Konstruktor, um die Konstruktionsmethode

Eine schnelle Möglichkeit, mithilfe von Reflektion ein leeres Parameterobjekt zu erstellen
* Voraussetzungen für die Verwendung:
* 1. In der Klasse muss ein Konstruktor mit leeren Parametern vorhanden sein
* 2. Der Modifikator des Konstruktors mit leeren Parametern kann nicht privat sein. Es wird empfohlen, public
*
* zu verwenden. Es gibt eine Methode in der Klassenklasse
* T newInstance(), um eine neue Instanz der Klasse zu erstellen dargestellt durch dieses Klassenobjekt.
*

Verwenden Sie die Reflexionstechnologie, um Mitgliedsvariablen (Felder) in der Klasse abzurufen, weisen Sie Mitgliedsvariablen Werte zu und erhalten Sie Werte
* privater Zeichenfolgenname;
* privat int age;
* public String sex;
*
* Implementierungsschritte:
* 1. Holen Sie sich das Klassendateiobjekt der Person-Klasse
* 2. Verwenden Sie die getField-Methode in der Klasse Dateiobjekt, um die Mitgliedsvariable abzurufen
* 3 .Verwenden Sie die Methode get/set in Field, um den Wert der Mitgliedsvariablen zu erhalten, und weisen Sie der Mitgliedsvariablen einen Wert zu




Verwenden Reflexionstechnologie, um die Mitgliedsmethode in der Klasse abzurufen und auszuführen
* public String getName()
* public void setName(String name)

* private void method()
*
 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     }
* Implementierungsschritte:
* 1. Holen Sie sich das Klassendateiobjekt der Person-Klasse

* 2. Verwenden Sie die Methode getMethod im Klassendateiobjekt, um die Mitgliedsmethode zu erhalten
* 3. Verwenden Sie die Methode invoke im Methode zum Ausführen der erhaltenen Methode
*
* Methode in der Methodenklasse: getName, Methodennamen abrufen
* String getName() Gibt den durch dieses Methodenobjekt dargestellten Methodennamen in String-Form zurück.




Umfassender Fall der Reflexion:
* Erhalten Sie JavaBean-Objekte mithilfe der Reflexionstechnologie und fügen Sie JavaBean-Mitgliedsvariablen Werte hinzu (weisen Sie diese zu)
*

* Implementierungsschritte:
* 1. Erstellen Sie eine JavaBean (Benutzerklasse)
 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     }
* 2. Erstellen Sie eine data.properties-Konfigurationsdatei und konfigurieren Sie die tatsächlichen Werte von Mitgliedsvariablen
* 3. Verwenden Sie IO+ Zu lesende Eigenschaftensammlung Rufen Sie die Konfigurationsdatei ab und speichern Sie die Daten in der Datei in der Sammlung

* 4. Verwenden Sie die Reflexionstechnologie, um ein JavaBean-Objekt zu erstellen
* 5. Durchlaufen Sie die Eigenschaftensammlung
* 6. Verwenden Sie die Eigenschaftensammlungsschlüssel zum Spleißen der setXXX-Methode
* 7. Verwenden Sie die Reflexionstechnologie, um die setXXX-Methode zu erhalten
* 8. Verwenden Sie die Reflexionstechnologie, um die setXXX-Methode auszuführen und Werte in Mitgliedsvariablen einzufügen




Verwenden Sie die Reflexionstechnologie, um die Schnittstelle zu erhalten
* Class[] getInterfaces() bestimmt die Schnittstelle, die von der Klasse oder Schnittstelle implementiert wird, die durch dieses Objekt dargestellt wird

 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     }

Das obige ist der detaillierte Inhalt vonJava-Tutorial – Grundlegende Stärkung_Reflexion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn