Cet article décrit l'utilisation du mécanisme de réflexion de la programmation Java. Partagez-le pour votre référence, comme suit:
Préface: Réflexion: Obtenez dynamiquement la classe (fichier bytecode tel que personne.classe dans cet article) et exécutez ses membres. La réflexion peut être légèrement moins rencontrée dans le développement de la couche d'application Android, mais pour ceux qui veulent passer à travers la couche sous-jacente, ils doivent être compétents pour l'utiliser.
Classe d'entité
Personne.java
package com.sunwenou.reflect; // nom de package de classe publique Personne {nom de chaîne privé; Âge privé; Public Person () {// Aucun paramètre} Personne publique (nom de chaîne, int Age) {// avec paramètre super (); this.name = name; this.age = âge; } public String getName () {Nom de retour; } public void setName (string name) {this.name = name; } public int getage () {return âge; } public void Setage (int Age) {this.age = age; } @Override public String toString () {Nom de retour + "," + âge; } public void show () {// vide paramètre System.out.println ("show"); } public void fun (String ss) {// avec paramètre System.out.println (ss); } public static void function () {// static System.out.println ("statique"); }}Méthodes pour obtenir dynamiquement les fichiers bytecode
Afin de rendre le billet de blog concis, une exception est lancée et l'importation est omise, la même ci-dessous.
package com.sunwenou.Reflect; Public Class Demo1 {/ ** * Méthode pour l'obtention de fichiers bytecode * 1: Utilisez la méthode de classe getClass () fournie par la classe d'objets * Cette méthode nécessite des objets * 2: chaque type de données a un attribut de classe statique, et le type de données renvoyé par cet attribut appartient à la méthode de fichier bytecode * int.classe personne. La chaîne est nécessaire, qui se compose du nom du package + nom de classe * / public static void main (String [] args) lève une exception {// getClaz (); // getCalz2 (); getClaz3 (); } // Utilisez la méthode forname () fournie par classe publique statique void getClaz3 () lève l'exception {class <?> Cllaz = class.forname ("com.sunwenou.reflect.person"); Classe <?> Claz2 = class.forname ("com.sunwenou.reflect.person"); System.out.println (Claz == Claz2); } // Chaque type de données a un attribut de classe statique public static void getCalz2 () {class <som> p1 = personne.class; Classe <ponge> p2 = personne.classe; System.out.println (P1 == P2); } // Utilisez la méthode de classe getClass () fournie par la classe d'objet public static void getClaz () {personne personne 1 = new personne (); Classe <? étend la personne> Claz = Person1.getClass (); // Person.class Person Person2 = new Person (); Classe <? étend la personne> Claz2 = Person2.getClass (); // Person.class System.out.println (Claz == Claz2); }}Obtenez dynamiquement la classe et créez l'objet
package com.sunwenou.reflect; public class Demo2 {public static void main (string [] args) lève exception {// createObj (); createObj2 (); } public static void createoBj2 () lève une exception {// personne personne = new personne ("lisi", 23); // Obtenez la classe d'objets de fichier bytecode <?> Cllaz = class.forname ("com.sunwenou.reflect.person"); //Person.class // Obtenez l'objet du constructeur de type auquel appartient la méthode du constructeur avec des paramètres. Constructor Constructor = Claz.getConstructor (String.class, int.class); // Créer l'objet en utilisant la méthode de création d'un objet fourni par la classe de constructeur personne personne = (personne) constructor.newinstance ("lisi", 23); System.out.println (personne); } public static void createoBj () lève une exception {// personne personne = new personne (); // Obtenez la classe d'objets de fichier bytecode <?> Cllaz = class.forname ("com.sunwenou.reflect.person"); Objet obj = cllaz.newinstance (); // Par défaut, utilisez le constructeur de paramètres vides pour créer le système objet.out.println (obj); }}Obtenez dynamiquement la classe et attribuez des valeurs aux variables membre
package com.sunwenou.reflect; public class Demo3 {public static void main (string [] args) lève une exception {// personne p = new personne (); //p.name = "Lisi"; // Obtenez la classe d'objets de fichier bytecode <?> cllaz = class.forname ("com.sunwenou.reflect.person"); // obtient l'objet du type de champ auquel la variable membre appartient // champ de champ = Claz.getField ("name"); // Obtenez le membre avec champ d'autorisation publique Field = Claz.getDeclaredField ("Name"); // Obtenez tous les champs déclarés System.out.println (champ); // Les variables des membres non statiques dépendent de l'objet obj = Claz.NewInstance (); field.setAccessible (true); // Brute Force Cracking, défini sur Field.Set accessible (OBJ, "Zhang San"); System.out.println (OBJ); }}Obtenez dynamiquement la classe et exécutez la méthode
package com.sunwenou.reflect; public class Demo4 {public static void main (string [] args) lève exception {// méthode1 (); Method2 (); Method3 (); } public static void method3 () lève une exception {// Obtenez la classe d'objet de fichier bytecode <?> Claz = class.forname ("com.sunwenou.reflect.person"); Méthode m = Claz.getMethod ("fonction", null); M.invoke (null, null); } //// Exécuter la méthode avec des paramètres publics static void méthode2 () lance l'exception {// Obtenez la classe d'objet de fichier bytecode <?> Cllaz = class.forname ("com.sunwenou.reflect.person"); Méthode m = Claz.getMethod ("Fun", String.class); Objet obj = Claz.NewInstance (); M.invoke (obj, "Bonjour"); } // Exécuter la méthode sans paramètres Public static void méthode1 () lève une exception {// personne personne = new personne (); personne.show (); // Obtenez la classe d'objets de fichier bytecode <?> Cllaz = class.forname ("com.sunwenou.reflect.person"); // Obtenez l'objet de fichier bytecode auquel appartient la méthode exécutée. Méthode m = Claz.getMethod ("Show", null); // Les méthodes non statiques dépendent de l'objet de l'objet obj = Claz.NewInstance (); // Exécuter la méthode M.Invoke (obj, null); }}C'est l'utilisation de base de la réflexion. Nous pouvons créer des objets via le fichier bytecode de l'objet lorsque nous ne pouvons pas créer des objets normalement et les exécuter. Avez-vous appris à le faire? ?
Pour plus d'informations sur le contenu lié à Java, veuillez consulter les sujets de ce site: "Introduction et didacticiel avancé sur la programmation orientée objet Java", "Tutorial sur la structure de données Java et l'algorithme", "Résumé des compétences de nœud Java Dom", "Résumé du fichier Java et des compétences de l'opération de répertoire" et "Résumé des compétences de fonctionnement de Java Cache" "
J'espère que cet article sera utile à la programmation Java de tous.