Tout d'abord, apprenons à connaître quelques catégories.
Classe (java.lang.class)
Un objet de classe est un objet spécial, et chaque classe a un objet de classe pour créer un objet "régulier" de cette classe. Il peut être obtenu via la méthode getClass () de l'objet.
Par exemple, nous exécutons cette ligne de code:
La copie de code est la suivante:
System.out.println ("test" .getClass (). ToString ());
Le résultat est:
La copie de code est la suivante:
classe java.lang.string
Field (java.lang.reflect.field)
Cette classe représente un champ, qui peut être utilisé pour accéder à la classe
Ensuite, créons la classe de test:
La copie de code est la suivante:
Livre de classe {
titre de chaîne publique;
public int longueur = 0;
Public ArrayList <Page> pages = null;
@Outrepasser
public String toString () {
String sb = "book: / n";
sb + = "title =" + title + "/ n";
sb + = "longueur =" + longueur + "/ n";
sb + = "pages =" + pages + "/ n";
if (pages! = null) {
pour (page page: pages) {
sb + = page.toString ();
}
}
return sb.toString ();
}
}
Classe Page {
@Outrepasser
public String toString () {
return "page / n";
}
}
Appelez la méthode suivante pour tester la classe ci-dessus:
La copie de code est la suivante:
Livre de livres = nouveau livre ();
System.out.println (livre);
Son résultat est le suivant:
La copie de code est la suivante:
Livre:
titre = null
longueur = 0
pages = null
C'est l'état initial de l'objet du livre
Nous utilisons le mécanisme de réflexion pour obtenir le champ de longueur dans l'objet du livre et le modifions pour afficher les résultats:
La copie de code est la suivante:
Livre de livres = nouveau livre ();
Classe <?> Aclass = book.getClass ();
Champ de champ = aclass.getField ("longueur");
field.sentInt (livre, 9);
System.out.println (livre);
Vous pouvez voir que les résultats en cours d'exécution sont:
La copie de code est la suivante:
Livre:
titre = null
longueur = 9
pages = null
On peut voir que la valeur du champ de longueur a été modifiée.
L'interdiction de modification est un champ simple de type int.
La copie de code est la suivante:
Livre de livres = nouveau livre ();
Classe <?> Aclass = book.getClass ();
Champ [] champs = aclass.getFields ();
pour (champ de champ: champs) {
field.setAccessible (true);
if (field.getType (). equals (string.class)) {
Field.set (livre, "Grimm's Fairy Tale");
} else if (field.getType (). equals (int.class)) {
field.set (livre, 199);
}
}
System.out.println (livre);
Le résultat de sortie du code ci-dessus est:
La copie de code est la suivante:
Livre:
titre = conte de fées de Grimm
longueur = 199
pages = null
En fait, tous les champs de type de chaîne sont modifiés en «conte de fées de Grimm» et tous les champs de type int sont modifiés à 199. Nous ne savons même pas ce que ce domaine signifie.
Ensuite, nous modifions le champ Pages. Ce champ est un ArrayList.
La copie de code est la suivante:
Livre de livres = nouveau livre ();
Classe <?> Aclass = book.getClass ();
Champ [] champs = aclass.getFields ();
pour (champ de champ: champs) {
field.setAccessible (true);
if (field.getType (). equals (arrayList.class)) {
String Genric = field.getGenericType (). ToString ();
String GenricClass = Genric.Substring (
genric.indexof ('<') + 1,
Genric.Indexof ('>'));
Class <?> EntityClass = class.forname (GenricClass);
Objet obj = entityClass.newinstance ();
ArrayList list = new ArrayList ();
list.add (obj);
field.set (livre, liste);
}
}
System.out.println (livre);
Le résultat de sortie est le suivant:
La copie de code est la suivante:
Livre:
titre = null
longueur = 0
pages = [page
]]
Page
On peut voir que bien que nous n'ayons pas utilisé directement la classe de page, nous avons quand même créé un objet page.
L'énoncé de création de l'objet Page est dans la phrase: entityClass.newInstance (). L'instruction NewInstance est une méthode importante d'objet de classe et est utilisée pour créer l'objet correspondant de cette classe. Bien sûr, le constructeur de classe le prend en charge. De plus, grâce à la méthode GenGenericType, nous pouvons obtenir le modificateur de type du champ. Mettez-le ici, ce que vous obtenez, c'est ArrayList <page>. Avec cette chaîne, nous pouvons charger la classe de page et créer un objet de page via la classe Class Class.Forname.