De nombreux frameworks grand public utilisent la technologie de réflexion. Par exemple, le framework ssh utilise deux technologies : XML comme fichier de configuration + technologie de réflexion.
Forfaits de cours liés à la réflexion.
java.lang.reflect.*; et java.lang.Class;
Tous les types en Java (y compris les types de base) correspondent à un objet Class, et cette classe est java.lang.Class. Autrement dit, chaque type a un objet Class qui lui correspond dans Class n'a pas de constructeur public. Notez que ce n’est pas qu’il n’y a pas d’accès public.
Comment obtenir un objet de classe
Copiez le code comme suit :
.Pour chaque object.getCalss(), vous pouvez obtenir la classe correspondante.
.Class.forName(String), la méthode d'écriture de String : nom du package.nom de classe. L'objet correspondant au nom du package.nom de classe sera créé Remarque : 1.2 s'applique uniquement aux types référence.
.Pour les types de base : la classe d'encapsulation TYPE représente l'objet Class du type de base correspondant.TYPE correspond à l'objet Class de int. Remarque : 3 s'applique uniquement aux types de base.
.Type, Classe. <Le type 4 est universel.>
Parmi les quatre méthodes ci-dessus, seule la méthode 2 est dynamique. Il suffit de modifier un package. Par conséquent, si vous souhaitez réellement incarner une programmation dynamique, vous ne pouvez utiliser que la méthode 2.
Il n'y a qu'un seul objet Class de chaque type, c'est-à-dire qu'ils n'ont qu'une seule adresse, mais les différents types sont différents.
Les résultats d'impression suivants sont donc tous vrais.
Copiez le code comme suit :
//Types de paire et de référence
Classe c1 = "".getClass();
Classe c2 = Class.forName("java.lang.String");
Classe c3 = String.class ;
System.out.println(c1 ==c2);//true
//Pour les types de base
Classe num1 = Entier.TYPE ;
Classe num2 = int.class;
System.out.println(num1 == num2);//true
Réflexion pour obtenir les méthodes associées des membres d'une classe
[Obtenir la structure <selon le type de paramètre>] (généralement utilisé sans déclaré)
Copiez le code comme suit :
Constructeur<T> getConstructor(Class<?>... ParameterTypes)
Renvoie un objet Constructor qui reflète le constructeur public spécifié de la classe représentée par cet objet Class.
Constructeur<?>[] getConstructors()
Renvoie un tableau contenant des objets Constructor qui reflètent tous les constructeurs publics de la classe représentée par cet objet Class.
Constructeur<T> getDeclaredConstructor(Class<?>... ParameterTypes)
Renvoie un objet Constructor qui reflète la méthode constructeur spécifiée pour la classe ou l'interface représentée par cet objet Class.
Constructeur<?>[] getDeclaredConstructors()
Renvoie un tableau d'objets Constructor qui reflètent toutes les méthodes constructeur déclarées par la classe représentée par cet objet Class.
[Obtenir l'attribut <selon le nom de l'attribut>] (généralement utilisé avec déclaré, car les attributs sont généralement privés)
Copiez le code comme suit :
Champ getField (Nom de la chaîne)
Renvoie un objet Field qui reflète les champs de membre public spécifiés de la classe ou de l'interface représentée par cet objet Class.
Champ[] getFields()
Renvoie un tableau contenant des objets Field qui reflètent tous les champs publics accessibles de la classe ou de l'interface représentée par cet objet Class.
Champ getDeclaredField (nom de chaîne)
Renvoie un objet Field qui reflète le champ déclaré spécifié de la classe ou de l'interface représentée par cet objet Class.
Champ[] getDeclaredFields()
Renvoie un tableau d'objets Field qui reflètent tous les champs déclarés par la classe ou l'interface représentée par cet objet Class.
[Obtention de la méthode <nom de la méthode plus type de paramètre>] (généralement utilisée sans déclaration)
Copiez le code comme suit :
Méthode getMethod(String name, Class<?>... ParameterTypes)
Renvoie un objet Method qui reflète la méthode membre publique spécifiée de la classe ou de l'interface représentée par cet objet Class.
Méthode[] getMethods()
Renvoie un tableau contenant des objets Method qui reflètent les membres publics de la classe ou de l'interface représentée par cet objet Class (y compris ceux déclarés par cette classe ou interface et ceux hérités des superclasses et superinterfaces).
Méthode getDeclaredMethod(String name, Class<?>... ParameterTypes)
Renvoie un objet Method qui reflète la méthode déclarée spécifiée de la classe ou de l'interface représentée par cet objet Class.
Méthode[] getDeclaredMethods()
Renvoie un tableau d'objets Method qui reflètent toutes les méthodes déclarées par la classe ou l'interface représentée par cet objet Class, y compris les méthodes publiques, protégées, par défaut (package) et privées, mais à l'exclusion des méthodes héritées.
T nouvelleInstance()
Crée une nouvelle instance de la classe représentée par cet objet Class. <new Instance() peut créer dynamiquement des objets>
Chaîne versChaîne()
Convertir un objet en chaîne.
Avis: newInstance() appelle un constructeur sans paramètre. Si la classe n'a pas de constructeur sans paramètre, newInstance() générera une exception.
Les méthodes déclarées prennent en charge la confidentialité, mais ne prennent pas en charge l'héritage. Les méthodes non déclarées prennent en charge l'héritage, mais ne prennent pas en charge la confidentialité et ne peuvent supprimer que des éléments publics.
Par conséquent, les propriétés sont généralement déclarées avec déclaration, car les propriétés sont généralement privées, les méthodes sont généralement obtenues sans déclaration et les constructeurs sont généralement obtenus sans déclaration.
La réflexion sur la simulation d'instance obtient des propriétés et des méthodes pertinentes dans la classe
Utiliser la réflexion pour attribuer des valeurs aux propriétés
Méthodes sur le terrain
Objet obtenir (Objet obj)
Renvoie la valeur du champ représenté par ce Field sur l'objet spécifié.
Champ f = c.getXXField (nom de la propriété) ;
valeur = f.get(objet);
ensemble vide (objet obj, valeur de l'objet)
Définit le champ représenté par cet objet Field sur la variable d'objet spécifiée sur la nouvelle valeur spécifiée.
f.set(objet, valeur);
Classe<?> getType()
Renvoie un objet Class qui identifie le type déclaré du champ représenté par cet objet Field.
Utilisé pour obtenir le type d'attribut (renvoie l'objet Class).
Copiez le code comme suit :
Classe c = Étudiant.classe ;
Object obj = c.newInstance(); //Créer un objet de la classe Student
Field f = c.getDeclaredField("name"); //Obtenir l'attribut name
f.setAccessible(true); //Définir l'accès privé.
f.set(obj, "zhangsan");
System.out.println(f.get(obj)); //Obtenir la valeur de l'attribut name de obj.
Utiliser la réflexion pour appeler des constructions L'appel réel au constructeur a lieu lorsque la méthode newInstance() est appelée.
Copiez le code comme suit :
Classe c = Class.forName("com.clazz.reflect.Student");
Constructeur con = c.getConstructor(); //Aucune construction n'est effectuée,
Objet cObj = c.getConstructor().newInstance();//Appeler le constructeur sans paramètre
Constructeur conAll = c.getConstructor(int.class,String.class,int.class);
Objet caobj = conAll.newInstance(1001,"zjamgs",234235);//Appelle le constructeur avec des paramètres.
System.out.println(caobj); //Imprimer la sortie
Appel de méthodes utilisant la réflexion Nom de l'objet.Méthode (valeur 1,2,3);
Méthode m = c.getMethoed (nom de la méthode, type de paramètre...);
m.invoke (objet, paramètres d'appel de méthode) Si le paramètre formel requis par la méthode sous-jacente est 0, la longueur du tableau args fourni peut être 0 ou nulle.
Copiez le code comme suit :
Classe c = Class.forName("com.clazz.reflect.Student");
Object obj = c.newInstance(); //Créer un objet Sutdent.
La méthode msetName = c.getMethod("setName", String.class);//obj n'a pas besoin de convertir le type
msetName.invoke(obj, "zhangsan");//Appelez la méthode setName et transmettez les paramètres.
Méthode msetId = c.getMethod("setId", int.class);
msetId.invoke(obj, 409090202);
System.out.println(obj);
Exemples d'application de réflexion Classe d'entité
Copiez le code comme suit :
paquet org.dennisit.reflect.entity ;
importer java.io.Serialisisable ;
/**
*
*Utilisateur.java
*
* @version : 1.1
*
* @auteur : Su Ruonian<a href="mailto:
[email protected]">Envoyer un e-mail</a>
*
* @depuis : 1.0 Heure de création : 2013-2-26 13:43:56
*
* TODO : la classe User.java est utilisée pour...
*
*/
L'utilisateur de classe publique implémente Serialisable{
test de chaîne privé ;
public void perform (Nom de la chaîne, âge int) {
System.out.println("name=" + nom + ",age=" + âge);
}
}
Cours de test de réflexion
Copiez le code comme suit :
paquet org.dennisit.reflect.main ;
importer java.lang.reflect.Field ;
/**
*
* ReflectEx.java
*
* @version : 1.1
*
* @auteur : Su Ruonian<a href="mailto:
[email protected]">Envoyer un e-mail</a>
*
* @depuis : 1.0 Heure de création : 2013-2-26 13:46:00
*
* TODO : la classe ReflectEx.java est utilisée pour...
*
*/
classe publique ReflectEx {
public static void main (String [] args) lance une exception {
Classe cls = Class.forName("org.dennisit.reflect.entity.User");
Objet obj = cls.newInstance(); //Créer un objet utilisateur
Field f = cls.getDeclaredField("test"); //Obtenir l'attribut de test
f.setAccessible(true); //Autorisations d'accès ouvertes pour le test d'attribut privé
f.set(obj, "zhangsan"); // Copier à nouveau pour le test
System.out.println(f.get(obj)); //Obtenir la valeur de l'attribut de test de obj
//Obtenir la méthode basée sur le nom de la méthode exécuter
java.lang.reflect.Method m = cls.getMethod("execute", String.class, int.class);
m.invoke(obj, "dennisit",23); //Appeler la méthode d'exécution
}
}
Effet de l'opération
Copiez le code comme suit :
Zhangsan
nom=dennisit,âge=23
Exemple d'écriture d'une classe d'instanciation dynamique réflexive
Copiez le code comme suit :
paquet org.dennisit.reflect.main ;
importer java.lang.reflect.Field ;
importer java.lang.reflect.Method ;
importer java.util.Map ;
importer java.util.Set ;
/**
*
* DynamicReflect.java
*
* @version : 1.1
*
* @auteur : Su Ruonian<a href="mailto:
[email protected]">Envoyer un e-mail</a>
*
* @depuis : 1.0 Heure de création : 2013-2-26 13:58:12
*
* TODO : Exemple d'instanciation dynamique utilisant la réflexion
*
*/
classe publique DynamicReflect {
L'objet statique public getInstance (String className, Map<String,Object> map) renvoie une exception {
Classe c = Class.forName(className);
Objet obj = c.newInstance(); //Objet objet
Set<String> keys = map.keySet(); //Obtenir tous les attributs correspondants
Field[] fAll = c.getDeclaredFields(); //Obtient toutes les propriétés de la classe
pour(int i=0;i<fAll.length;i++){
for(String key:keys){ //Correspondance de boucle
if(fAll[i].getName().equals(key)){ //Si l'attribut transmis par l'utilisateur correspond au nom de l'attribut dans la classe obtenue
Champ f = c.getDeclaredField(key);//Obtenir cet attribut
//Construit le nom de la méthode setXxx()
String methodName = "set" + key.substring(0,1).toUpperCase()+key.substring(1);
Method method = c.getMethod(methodName, f.getType());//Obtenir la méthode correspondante en fonction du nom d'utilisateur construit
method.invoke(obj, map.get(key));//Appel de méthode
}autre{
continuer;
}
}
}
retourner obj ;
}
}
Nous testons ensuite l'exemple d'instanciation de réflexion dynamique que nous avons écrit
Classe d'entité
Copiez le code comme suit :
paquet org.dennisit.reflect.entity ;
importer java.io.Serialisisable ;
/**
*
*Utilisateur.java
*
* @version : 1.1
*
* @auteur : Su Ruonian<a href="mailto:
[email protected]">Envoyer un e-mail</a>
*
* @depuis : 1.0 Heure de création : 2013-2-26 13:43:56
*
* À FAIRE : classe d'entité
*
*/
L'utilisateur de classe publique implémente Serialisable{
nom de chaîne privé ;
âge int privé ;
e-mail de chaîne privée ;
public User() { //Ne doit avoir aucun constructeur de paramètres
}
//getter() et setter()
}
Classe de test principale
Copiez le code comme suit :
paquet org.dennisit.reflect.main ;
importer java.util.HashMap ;
importer java.util.Map ;
importer org.dennisit.reflect.entity.User ;
/**
*
* ReflectEx.java
*
* @version : 1.1
*
* @auteur : Su Ruonian<a href="mailto:
[email protected]">Envoyer un e-mail</a>
*
* @depuis : 1.0 Heure de création : 2013-2-26 13:46:00
*
* TODO : la classe ReflectEx.java est utilisée pour...
*
*/
classe publique ReflectEx {
public static void main (String [] args) lance une exception {
Classe cls = Class.forName("org.dennisit.reflect.entity.User");
String className = "org.dennisit.reflect.entity.User";
Map<String,Object> map = new HashMap<String, Object>();
map.put("nom", "dennisit");
map.put("âge", 22);
map.put("email", "[email protected]");
Utilisateur user = (User)DynamicReflect.getInstance(className, map);
System.out.println(user.getName() + "," + user.getAge() + "," + user.getEmail());
}
}
Résultats de l'exécution du programme
Copiez le code comme suit :