Heim Java javaLernprogramm Java-Tutorial – Grundlegende Stärkung_Reflexion

Java-Tutorial – Grundlegende Stärkung_Reflexion

Jun 27, 2017 am 09:19 AM
加强 反射 基础

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     }
Nach dem Login kopieren
* 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     }
Nach dem Login kopieren
* 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     }
Nach dem Login kopieren

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!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Reflexionsmechanismus-Implementierung von Schnittstellen und abstrakten Klassen in Java Reflexionsmechanismus-Implementierung von Schnittstellen und abstrakten Klassen in Java May 02, 2024 pm 05:18 PM

Der Reflexionsmechanismus ermöglicht es Programmen, Klasseninformationen zur Laufzeit abzurufen und zu ändern. Er kann zur Implementierung der Reflexion von Schnittstellen und abstrakten Klassen verwendet werden: Schnittstellenreflexion: Erhalten Sie das Schnittstellenreflexionsobjekt über Class.forName() und greifen Sie auf seine Metadaten (Name, Methode usw.) zu Feld) . Reflexion abstrakter Klassen: Ähnlich wie bei Schnittstellen können Sie das Reflexionsobjekt einer abstrakten Klasse abrufen und auf deren Metadaten und nicht-abstrakte Methoden zugreifen. Praktischer Fall: Der Reflexionsmechanismus kann zur Implementierung dynamischer Proxys verwendet werden, indem Aufrufe von Schnittstellenmethoden zur Laufzeit durch dynamisches Erstellen von Proxy-Klassen abgefangen werden.

So verwenden Sie Reflection, um auf private Felder und Methoden in Golang zuzugreifen So verwenden Sie Reflection, um auf private Felder und Methoden in Golang zuzugreifen May 03, 2024 pm 12:15 PM

Sie können Reflektion verwenden, um auf private Felder und Methoden in der Go-Sprache zuzugreifen: So greifen Sie auf private Felder zu: Rufen Sie den Reflektionswert des Werts über „reflect.ValueOf()“ ab, verwenden Sie dann „FieldByName()“, um den Reflektionswert des Felds abzurufen, und rufen Sie auf String()-Methode zum Drucken des Feldwerts. Rufen Sie eine private Methode auf: Rufen Sie auch den Reflexionswert des Werts über Reflect.ValueOf () ab, verwenden Sie dann MethodByName (), um den Reflexionswert der Methode abzurufen, und rufen Sie schließlich die Methode Call () auf, um die Methode auszuführen. Praktischer Fall: Ändern Sie private Feldwerte und rufen Sie private Methoden durch Reflexion auf, um Objektkontrolle und Komponententestabdeckung zu erreichen.

Sicherheitsüberlegungen und beste Lösungen für die Golang-Reflexion Sicherheitsüberlegungen und beste Lösungen für die Golang-Reflexion May 04, 2024 pm 04:48 PM

Reflection bietet Funktionen zur Typprüfung und -änderung in Go, birgt jedoch Sicherheitsrisiken, einschließlich der Ausführung willkürlichen Codes, Typfälschung und Datenlecks. Zu den Best Practices gehören die Einschränkung reflektierender Berechtigungen und Vorgänge, die Verwendung von Whitelists oder Blacklists, die Validierung von Eingaben und die Verwendung von Sicherheitstools. In der Praxis kann die Reflexion sicher zur Überprüfung von Typinformationen eingesetzt werden.

So verwenden Sie Reflektion, um Variablenwerte in Golang dynamisch zu ändern So verwenden Sie Reflektion, um Variablenwerte in Golang dynamisch zu ändern May 02, 2024 am 11:09 AM

Mit der Go-Sprachreflexion können Sie Variablenwerte zur Laufzeit bearbeiten, einschließlich der Änderung boolescher Werte, Ganzzahlen, Gleitkommazahlen und Zeichenfolgen. Indem Sie den Wert einer Variablen abrufen, können Sie die Methoden SetBool, SetInt, SetFloat und SetString aufrufen, um ihn zu ändern. Sie können beispielsweise einen JSON-String in eine Struktur analysieren und dann mithilfe von Reflection die Werte der Strukturfelder ändern. Es ist zu beachten, dass der Reflexionsvorgang langsam ist und nicht veränderbare Felder nicht geändert werden können. Beim Ändern des Strukturfeldwerts werden die zugehörigen Felder möglicherweise nicht automatisch aktualisiert.

Einführung in die Golang-Reflexion und Analyse von Anwendungsszenarien Einführung in die Golang-Reflexion und Analyse von Anwendungsszenarien Apr 03, 2024 pm 01:45 PM

Die Reflexionsfunktion in der Go-Sprache ermöglicht es einem Programm, die Struktur eines Typs zur Laufzeit zu überprüfen und zu ändern. Durch die Verwendung von Type, Value und Reflect.Kind können wir die Typinformationen, Feldwerte und Methoden des Objekts abrufen und auch Objekte erstellen und ändern. Zu den spezifischen Operationsmethoden gehören: Überprüfen des Typs (TypeOf()), Abrufen des Feldwerts (ValueOf(), FieldByName()), Ändern des Feldwerts (Set()) und Erstellen eines Objekts (New()).

So verwenden Sie Reflektion, um neue Typen in Golang zu erstellen So verwenden Sie Reflektion, um neue Typen in Golang zu erstellen May 01, 2024 am 09:21 AM

Mithilfe von Reflection ermöglicht Go die Erstellung neuer Typen. 1. Verwenden Sie Reflect.TypeOf(), um den Reflect.Type-Wert eines vorhandenen Typs abzurufen. 2. Verwenden Sie Reflect.New(), um einen Zeigerwert eines neuen Typs zu erstellen . Über *Ptr.Elem( ), um auf den tatsächlichen Wert zuzugreifen. 4. Reflection kann auch dynamisch neue Typen basierend auf Zeichenfolgen erstellen, die zum Erstellen flexibler und dynamischer Programme verwendet werden.

Verwenden Sie den Java-Reflexionsmechanismus zur Methodenüberladung? Verwenden Sie den Java-Reflexionsmechanismus zur Methodenüberladung? Apr 15, 2024 pm 10:54 PM

Der Reflexionsmechanismus wird in Java verwendet, um das Überladen von Methoden zu implementieren: Methoden durch Reflexion abrufen: Verwenden Sie die Methode getMethod (), um das Methodenobjekt abzurufen und den Methodennamen und den Parametertyp anzugeben. Aufrufende Methode: Verwenden Sie die Methode invoke(), um die Methode aufzurufen, und geben Sie dabei das Aufruferobjekt und die Parameterwerte an.

Die Golang-Funktion verwendet Reflexion, um aspektorientierte Programmierung zu implementieren Die Golang-Funktion verwendet Reflexion, um aspektorientierte Programmierung zu implementieren Apr 25, 2024 pm 05:48 PM

Antwort: Ja, die Reflexion in der Go-Sprache kann aspektorientierte Programmierung implementieren. Detaillierte Beschreibung: Reflection ermöglicht es einem Programm, seine eigenen Typen und Werte zur Laufzeit zu ändern und zu überprüfen. Durch Reflexion können wir globale Aspekte für den Code erstellen, die vor und nach der Ausführung der Funktion ausgelöst werden. Dadurch können wir problemlos Funktionen wie die Protokollierung hinzufügen, ohne den vorhandenen Code zu ändern. Reflection bietet die Vorteile der Code-Entkopplung, Skalierbarkeit und flexiblen Steuerung und verbessert dadurch die Wartbarkeit und Wiederverwendbarkeit von Anwendungen.

See all articles