Lassen Sie uns zunächst einige Kategorien kennenlernen.
Klasse (java.lang.class)
Ein Klassenobjekt ist ein spezielles Objekt, und jede Klasse hat ein Klassenobjekt, um ein "reguläres" Objekt dieser Klasse zu erstellen. Es kann durch die GetClass () -Methode des Objekts erhalten werden.
Zum Beispiel führen wir diese Codezeile aus:
Die Codekopie lautet wie folgt:
System.out.println ("test" .getClass (). ToString ());
Das Ergebnis ist:
Die Codekopie lautet wie folgt:
Klasse Java.lang.String
Feld (java.lang.reflect.field)
Diese Klasse repräsentiert ein Feld, mit dem man auf die Klasse zugreifen kann
Lassen Sie uns als nächstes die Testklasse erstellen:
Die Codekopie lautet wie folgt:
Klassenbuch {
öffentlicher String -Titel;
öffentliche int länge = 0;
public arrayList <page> Seiten = null;
@Override
public String toString () {
String sb = "Buch:/n";
sb+= "title ="+title+"/n";
Sb + = "Länge =" + Länge + "/n";
sb + = "pages =" + Seiten + "/n";
if (Seiten! = null) {
für (Seite Seite: Seiten) {
sb += page.toString ();
}
}
return sb.tostring ();
}
}
Klassenseite {
@Override
public String toString () {
Rückgabe "Seite/n";
}
}
Rufen Sie die folgende Methode an, um die obige Klasse zu testen:
Die Codekopie lautet wie folgt:
Buchbuch = neues Buch ();
System.out.println (Buch);
Sein Ergebnis ist Folgendes:
Die Codekopie lautet wie folgt:
Buch:
Titel = NULL
Länge = 0
Seiten = null
Dies ist der Anfangszustand des Buchobjekts
Wir verwenden den Reflexionsmechanismus, um das Feld Länge im Buchobjekt zu erhalten und es zu ändern, um die Ergebnisse anzuzeigen:
Die Codekopie lautet wie folgt:
Buchbuch = neues Buch ();
Klasse <?> Aclass = book.getClass ();
Field field = aclass.getField ("Länge");
Field.Setint (Buch, 9);
System.out.println (Buch);
Sie können sehen, dass die laufenden Ergebnisse sind:
Die Codekopie lautet wie folgt:
Buch:
Titel = NULL
Länge = 9
Seiten = null
Es ist ersichtlich, dass der Wert des Längenfeldes geändert wurde.
Das obige Modified ist ein einfaches Feld des Int -Typs.
Die Codekopie lautet wie folgt:
Buchbuch = neues Buch ();
Klasse <?> Aclass = book.getClass ();
Field [] fields = aclass.getFields ();
für (Feldfeld: Felder) {
field.setAccessible (true);
if (field.gettType (). Equals (string.class)) {
Field.Set (Buch, "Grimms Märchen");
} else if (field.gettType (). Equals (int.class)) {
Field.Set (Buch, 199);
}
}
System.out.println (Buch);
Das Ausgabeergebnis des obigen Codes lautet:
Die Codekopie lautet wie folgt:
Buch:
Titel = Grimms Märchen
Länge = 199
Seiten = null
Tatsächlich werden alle Felder des String -Typs an "Grimms Märchen" geändert und alle Felder des Int -Typs werden auf 199 modifiziert. Wir wissen nicht einmal, was dieses Feld bedeutet.
Als nächstes ändern wir das Feld Seiten. Dieses Feld ist eine ArrayList.
Die Codekopie lautet wie folgt:
Buchbuch = neues Buch ();
Klasse <?> Aclass = book.getClass ();
Field [] fields = aclass.getFields ();
für (Feldfeld: Felder) {
field.setAccessible (true);
if (field.gettType (). Equals (arrayList.class)) {
String genric = field.getGenericType (). ToString ();
String GenricClass = Genric.substring (
Genric.Indexof ('<') + 1,
Genric.Indexof ('>'));
Class <?> EntityClass = class.ForName (GenricClass);
Objekt obj = EntityClass.Newinstance ();
ArrayList List = new ArrayList ();
list.add (obj);
Field.Set (Buch, Liste);
}
}
System.out.println (Buch);
Das Ausgabeergebnis ist wie folgt:
Die Codekopie lautet wie folgt:
Buch:
Titel = NULL
Länge = 0
Seiten = [Seite
]
Seite
Es ist ersichtlich, dass wir die Seitenklasse zwar nicht direkt verwendet haben, wir jedoch noch ein Seitenobjekt erstellt haben.
Die Erstellungsanweisung des Seitenobjekts befindet sich im Satz: entityClass.newinstance (). Die NewInstance -Anweisung ist eine wichtige Methode des Klassenobjekts und wird verwendet, um das entsprechende Objekt dieser Klasse zu erstellen. Natürlich unterstützt der Klassenkonstruktor ihn. Darüber hinaus können wir durch die Gengenericype -Methode den Typmodifikator des Feldes abrufen. Setzen Sie es hier, was Sie erhalten, ist ArrayList <Page>. Mit dieser Zeichenfolge können wir die Seitenklasse laden und ein Seitenobjekt über die Klasse Loader -Klasse.Forname erstellen.