Le mécanisme de réflexion Java est dans l'état de course. Une méthode d'objet est appelée le mécanisme de réflexion de la langue java. Le concept de réflexion a été proposé pour la première fois par Smith en 1982, se référant principalement à une capacité à laquelle un programme peut accéder, détecter et modifier son propre état ou comportement. La proposition de ce concept a rapidement déclenché la recherche sur la réflectivité appliquée dans le domaine de l'informatique. Il a d'abord été adopté dans le domaine de la conception du langage de programmation et des réalisations dans LISP et orientées objet. Bien sûr, la réflexion elle-même n'est pas un nouveau concept.
Le mécanisme de réflexion Java fournit principalement les utilisations suivantes:
Déterminez la classe à laquelle tout objet appartient à l'exécution
Construire des objets de n'importe quelle classe lors de l'exécution
Déterminez les variables et méthodes des membres de toute classe lors de l'exécution
Appeler des méthodes de tout objet lors de l'exécution
Tout d'abord, jetons un coup d'œil à un exemple simple et utilisons cet exemple pour comprendre comment fonctionne le mécanisme de réflexion de Java.
Package com.wanggc.reflection; Importer java.lang.reflect.method; / ** * Java Reflection Exercices. * * @author wanggc * / classe publique ForNameTest {/ ** * Fonction d'entrée. * * @param args * Paramètres * @Throws Exception * Message d'erreur * / public static void main (String [] args) lance l'exception {// get class class <?> CLS = class.fornam e (args [0]); / / Obtenez l'objet correspondant à travers la méthode de classe [] Methods = Cls.getMethods ();Lorsque le paramètre passé est java.lang.string, le résultat suivant sera sorti
public booléen java.lang.string.equals (java.lang.object) public java.lang.string java.lang.string.tostring () public int java.lang.string.hashcode () pu blic int java.lang.string Compareto (java.lang.string) public int java.lang.string. int) public int java.lang.string.indexof (java.lang.string) public int java.lang.string.indexof (java.lang.string, int) public static java.lang.string java.lang .string.valueof statique (int) public static java.lang.string java.lang.string.valueof (char) public static java.lang.string java.lang.string java.lang.string.valueof (boolean) public static java.lang.st ring java.lang.string.valueof (float) public static java.lang.string java.lang.string.valueof (char [], int, int) public static java.lang.string java.lang.string.valueof (double) public s tatic java.lang.string java .lang.string.valueof (char []) public static java.lang.string java.lang.string.valueof (java.lang.object) public static java.lang.string java. Lang.String. Str ing.CodePointCount (int, int) public int java.lang.string.comparetoignorecase (java.lang.string) public java.lang.string java.lang.string.concat (java.lang.string) public Boolean Java.lang .String .Contains (java.lang.charsequence) booléen public java.lang.string.contentequals (java.lang.charsequence) Boolean java.lang.string.contentequals (java.lang.stringbuffer) public stati c java.lang. String java.lang.string.copyValueof (char []) public static java.lang.string java.lang.string.copyvalueof (char [], int, int) public booléen java.lang.string.endswith (java.lang. String) public boolean java.lang.string.equalsignorecase (java.lang.string) public static java.lang.string java.lang.string.format (java.lang.string, java.lang.object []) public static java .lang.string java.lang.st ring.format (java.util.locale, java.lang.string, java.lang.object []) byte public [] java.lang.string.getbytes (java.lang.string ) lance java.io.unsupportEnc OddExceptionPublic void java.lang. Getbytes (java.nio.charset.char) public void java .lang.string.getchars (int, int, char [], int) public natif java.lang.string java.lang.string.intern () booléen publique java java .lang.String.isEmpty()public int j ava.lang. String.lastIndexOf(java.lang.String)public int java.lang.String.lastIndexOf(int,int)public int java.lang.String.lastIndexOf(int )public int java.lan g.String.lastIndexOf(java.lang. String,int)public int java.lang.String.length()public boolean java.lang.String.matches(java.lang.String)public int java .lang.string.offsetbycodepoin ts (int, int) public boolean java.lang .string.regionmatches (boolean, int, java.lang.string, int, int, int) public boolean java.lang.string.regionmatches (int, java.lang.string, int, int) public java.lan g.string java.lang .string.replace (java.lang.charsequence, java.lang.charsequence) public java.lang.string java.lang.string.replace (Char, char) public java.lang.string java .lang.string.replaceall (java .lang.string, java.lang.string) public java.lang.string java.lang.string.replaceFirst (java.lang.string , java.lang.string) public java.lang.string [] java.lan g.string .split (java.lang.string) public java.lang.string [] java.lang.string.split (java.lang. String, int) public boolean java.lang.string.startswith (java.lang.st ring) public booléen java.lang.string.startswith (java.lang.string, int) public java.lang.charsence java.lang.string .SubSequence (int, int) public java.lang.string j ava.lang.string.substring (int) public java.lang.string java.lang.string.substring (int, int) public char [] java.lang. String.tocharArray () public java.lang.string java.lang.string.tolow ercase () public java. .String java.lang.string.touppercase () public java.lang.string java.lang.string ing.touppercase (java.util. void java.lang.object.wait (long) lance java.lang.interruptedExceptionpub lic final void java.lang.object.wait () lance java .lang.interruptedExceptionpublic final void java.lang.object.wait (long, int) lance final final java.lang.object.wait (long, int) lance final Void Java.lang.object.wait (Long, int) Lacture finale Void Java.lang.Object.Wait (Long, int) lance final java.lang.interruptedExceptionpublic Native Java.lang.cla ss java.lang.object.getclass () Native final void java.lang.object.
Cela répertorie tous les noms de méthodes, leurs caractères limitants, les types de retour et les exceptions lancées de la classe java.lang.string. Ce programme utilise la méthode Forname de classe de classe pour charger la classe spécifiée, puis appelle la méthode GetMethods pour renvoyer la liste de méthodes de la classe spécifiée. java.lang.reflect.method est utilisé pour exprimer une seule méthode dans une certaine classe.
L'utilisation du mécanisme de réflexion de Java nécessite généralement trois étapes:
Obtenez l'objet de classe que vous souhaitez utiliser la classe via l'objet de classe obtenu dans la première étape pour obtenir la méthode de la classe ou la méthode ou l'attribut obtenu dans la deuxième étape du fonctionnement du nom de classe.
Java运行的时候,某个类无论生成多少个对象,他们都会对应同一个Class对象,它表示正在运行程序中的类和接口。 Il existe trois façons courantes d'obtenir des objets de classe de la classe d'opération:
Forname de la méthode statique de la classe d'appel, comme indiqué dans l'exemple ci-dessus;
Utilisez la syntaxe .class de la classe, telle que: class <?> Cls = string.class;
Appelez la méthode GetClass de l'objet, tel que: String str = "ABC"; Class <?> CLS = Str .getClass ();
Les éléments suivants utiliseront un exemple pour décrire comment exécuter une certaine méthode d'un objet à travers les trois étapes mentionnées ci-dessus:
package com.wanggc.reflection; 11 Obtenez la méthode Show de la classe d'affichage via la méthode de la classe = Cls.getMethod (show ", string.class); void show (nom de chaîne) {System.out.println ("Hello:" + Name);Comme mentionné précédemment, chaque classe d'un programme Java aura un objet de classe qui y correspondait. La première étape de la réflexion Java consiste à obtenir cet objet de classe, comme 14 lignes de code. Bien sûr, la méthode de chaque classe doit également avoir un objet de méthode correspondant à lui. Pour appeler cette méthode par la réflexion, vous devez d'abord obtenir l'objet de méthode de cette méthode, tel que la ligne 16 du code, puis utiliser l'objet de méthode pour appeler cette méthode à son tour, comme la ligne 18 du code. Notez que le premier paramètre de la méthode GetMethod dans la ligne 16 est le nom de la méthode, et le second est le type de paramètre de cette méthode. Exécutez la méthode invoquée de 18 lignes de code, qui est en fait la méthode Show. Le paramètre est de le transmettre à la méthode Show. Le type et le nombre doivent être cohérents avec la méthode GetMethod de 16 lignes.
L'exemple ci-dessus montre comment appeler une méthode d'une certaine classe par la réflexion.
package com.wanggc.reflection; 11 ; Student.SetStuage (); ) + ":" + destStudent.getStuage ());} / ** * Copier les informations de l'objet étudiant. * * @param de * Copiez l'objet source * @param dest * Copiez l'objet cible * @throws exception * Exception * / Private Static void copybean (objet de, objet dest) lève une exception {// Obtenez l'objet de classe de la copie Classe d'objets source <?> FromClass = From.getClass (); > destClass = dest.getClass (); champ destfield = null; Nom de l'objet Copy Target Destfield = destc lass.getDeclaredField (Name); Object à l'attribut correspondant de l'objet Copy Target destfield.set (dest, fromfield. :::::::::::::::::::::::::::::::::::::- : :::::::::::::::::::::::::::::::::::- ::::::::::::::::::::::::::::::::::::::- ; * / class Student {/ ** nom * / private String étourdisse * * @return Nom de l'étudiant * / public String getStuname () {return étalame;} / ** * set le nom de l'étudiant * * @param étourdissement * Nom de l'étudiant * / public void setStuname (String st uname) {this.stuname = stuname; } /** * Get student age* * @return Student age*/ public int getStuAge() { return stuAge; } /** * Set student age* * @param stuAge * Student age*/ public void setStuAge(int st uAge ) {this.Stuage = Stuage;}}Java的发射机制中类有Class对应,类的方法有Method对应,当然属性也有Field与之对应。 Les commentaires du code ont été commentés en détail et ne seront pas répétés ici. Mais sachez que Field fournit des méthodes GET et définis pour obtenir et définir les valeurs des attributs, mais comme l'attribut est un type privé, l'accessibilité de l'attribut doit être définie sur true, comme les lignes 50 ~ 51 de la code. Vous pouvez également définir l'accessibilité pour l'ensemble des champs et utiliser la méthode statique de AccessibleObject SetAccessible sous 40 lignes, telles que: accessibleObject.SetAccessible (FromFields, True);
La description précédente montre comment utiliser le mécanisme de réflexion Java pour faire fonctionner les méthodes et les propriétés d'une classe.
package com.wanggc.reflection; 11 ; student.setStuAge(); // Create the copy target object Student destStudent = (Student) copyBean(student); // Output the copy result System.out.println(destStudent.getStuName() + ":" + destStudent.getStuAge ());} / ** * Copier les informations de l'objet étudiant. * * @param from * Copy the source object* @param dest * Copy the target object* @throws Exception * Exception */ private static Object copyBean(Object from) throws Exception { // Get the copy Class object of source object Class< ?> fromClass = from.getClass(); // Get the attribute list of the copy source object Field[] fromFields = fromClass.getDeclaredFields(); // Get the Class object of the copy target object Object ints = fromClass.newInstan ce (); for (Field fromField : fromFields) { // Set the accessibility of the attribute fromField.setAccessible(true); // Assign the value of the attribute of the copy source object to the corresponding attribute of the copy target object fromField. set (ints, fromfield.get (from));} return INTS;}} / ** * classe étudiante. * / class Student {/ ** nom * / private String étourdisse * * @return Nom de l'étudiant * / public String getStuname () {return étalame;} / ** * set le nom de l'étudiant * * @param étourdissement * Nom de l'étudiant * / public void setStuname (String st uname) {this.stuname = stuname; } / ** * Obtenez l'âge de l'étudiant * * @return Student Age * / public int getStuage () {return stuage; ) {this.Stuage = Stuage;}}Le résultat de cet exemple et de l'exemple précédent est le même. Cependant, l'objet renvoyé par la méthode CopyBean n'est plus transmis à l'extérieur, mais est généré en interne par la méthode, comme indiqué dans le code sur la ligne 40. Remarque: la méthode NewInstance de la classe ne peut créer que des classes contenant des constructeurs sans paramètres. wanggc ");
À ce stade, les fonctions communes du mécanisme de réflexion Java (la méthode d'appel des objets lors de l'exécution, l'utilisation des attributs de classe et la création d'objets de classe) ont été introduits.
Supplément: Lors de l'obtention des méthodes, des propriétés et des constructeurs de la classe, il existe deux méthodes correspondantes: GetXxx et GetGetDeclaredxxx. La différence est que les premières méthodes et propriétés avec des droits d'accès publics, y compris ceux de la classe parentale;
Le contenu ci-dessus est le mécanisme de lancement de Java qui vous est présenté, j'espère que vous l'aimez.