Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

黄舟
黄舟Original
2017-10-17 09:36:141900Durchsuche

In diesem Artikel wird hauptsächlich das Implementierungsprinzip der Java-Methodenreflexion ausführlich vorgestellt, das einen gewissen Referenzwert hat.

Der Blogger sagte: Der Java-Reflexionsmechanismus ist Im laufenden Zustand können Sie für jede Klasse alle Eigenschaften und Methoden dieser Klasse kennen und jede ihrer Methoden und Eigenschaften aufrufen wird als Reflexionsmechanismus der Java-Sprache bezeichnet. In diesem Artikel analysiert Zhan Xiaolang das Implementierungsprinzip (Quellcode) des Java-Reflexionsmechanismus. Interessierte Schüler können diesen Artikel einige Minuten lang lesen, um ihn zu verstehen.

Text

Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

Methodenreflexionsinstanz


public class ReflectCase {

  public static void main(String[] args) throws Exception {
    Proxy target = new Proxy();
    Method method = Proxy.class.Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode("run");
    method.Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode(target);
  }

  static class Proxy {
    public void run() {
      System.out.println("run");
    }
  }
}
Bestanden Der Reflexionsmechanismus von Java kann zur Laufzeit jede Methode eines Objekts aufrufen, wenn auf diese Weise eine große Anzahl von Aufrufen erfolgt. Gibt es dann irgendwelche Leistungs- oder Speicherrisiken? Um den Reflexionsmechanismus der Methode vollständig zu verstehen, können wir nur mit dem zugrunde liegenden Code beginnen!

Method Get

Rufen Sie Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode der Class-Klasse auf, um das Methodenobjekt Method mit dem angegebenen Methodennamen und den angegebenen Parametern abzurufen.

Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

Die Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode-Methode ruft die Liste der in der Klasse deklarierten Methoden aus dem Cache oder der Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode und der Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode-Methode ab gibt zurück. Suchen Sie nach einem Methodenobjekt, das dem Namen und den Parametern in der Methodenliste entspricht.

Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

Wenn eine passende Methode gefunden wird, wird eine neue Kopie zurückgegeben, also die

-Methode. Method.copy()

Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

Das bei jedem Aufruf der Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode-Methode zurückgegebene Methodenobjekt ist tatsächlich ein neues Objekt, und das Stammattribut des neuen Objekts verweist bei häufigem Bedarf auf das ursprüngliche Methodenobjekt Beim Aufruf ist es am besten, das Methodenobjekt zwischenzuspeichern.

Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

Rufen Sie die Liste der in dieser Klasse deklarierten Methoden aus dem Cache oder der Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode ab. Die Implementierung ist wie folgt:

Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

Die Methode „Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode()“ wird wie folgt implementiert:

Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

Hier gibt es eine wichtigere Datenstruktur ReflectionData, die zum Zwischenspeichern der folgenden Attributdaten von verwendet wird Die aus der Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode gelesene Klasse:

Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

Aus der Implementierung der ReflectionData()-Methode ist ersichtlich, dass das ReflectionData-Objekt vom Typ SoftReference ist, was darauf hinweist, dass es recycelt werden kann Wenn der Speicher knapp ist, kann dies jedoch auch über den Parameter -XX:SoftRefLRUPolicyMSPerMB gesteuert werden. Zum Zeitpunkt des Recyclings wird es recycelt, solange GC auftritt. Wenn ReflectionData recycelt und die Reflection-Methode ausgeführt wird, dann ein solches Objekt kann nur über die Methode Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode neu erstellt werden. Die Methode Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode wird wie folgt implementiert:

Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

Setzen Sie das ReflectionData-Feld über die Methode „unsafe.compareAndSwapObject“ zurück. Wenn das über ReflectionData () erhaltene ReflectionData-Objekt nicht leer ist, versuchen Sie, die deklarierteMethods-Eigenschaft vom ReflectionData-Objekt abzurufen. Wenn es sich um Once handelt oder wenn das neu initialisierte Klassenattribut nach der Wiederverwertung durch GC leer ist, müssen Sie es abrufen erneut aus der Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode und weisen Sie sie ReflectionData zu. Die zwischengespeicherten Daten können beim nächsten Aufruf verwendet werden.

Methodenaufrufe

Nachdem Sie die angegebene Methodenobjektmethode erhalten haben, können Sie deren Aufrufmethode wie folgt aufrufen:

Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

Es ist zu beachten, dass das Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode-Objekt hier der Schlüssel zur Implementierung der Invoke-Methode ist. Zunächst ist der methodAccessor leer und Sie müssen acquireDetaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode aufrufen, um ein neues Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode-Objekt zu generieren selbst ist eine Schnittstelle, die wie folgt implementiert ist:

Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

In der acquireDetaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode-Methode wird ein Objekt, das die Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode-Schnittstelle implementiert, über newDetaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode der ReflectionFactory-Klasse erstellt lautet wie folgt:

newDetaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

In der ReflectionFactory-Klasse gibt es zwei wichtige Felder: noInflation (Standardwert falsch) und inflationThreshold (Standardwert 15). In der checkInitted-Methode können Sie -Dsun.reflect.inflationThreshold=xxx und -Dsun.reflect.noInflation= übergeben true Setzen Sie diese beiden Felder zurück und legen Sie sie nur einmal fest. Wenn noInflation false ist, gibt die Methode newDetaillierte Erläuterung der Prinzipien der Java-ReflexionsimplementierungsmethodeImpl das DelegatingDetaillierte Erläuterung der Prinzipien der Java-ReflexionsimplementierungsmethodeImpl-Objekt zurück:

DelegatingDetaillierte Erläuterung der Prinzipien der Java-ReflexionsimplementierungsmethodeImpl

Tatsächlich DelegatingDetaillierte Erläuterung der Prinzipien der Java-ReflexionsimplementierungsmethodeImpl-Objekt Es ist ein Proxy-Objekt, das für den Aufruf der Invoke-Methode des Delegaten des delegierten Objekts verantwortlich ist. Der Delegate-Parameter ist derzeit ein NativeDetaillierte Erläuterung der Prinzipien der Java-ReflexionsimplementierungsmethodeImpl-Objekt, daher ruft die Invoke-Methode der letzten Methode die Invoke-Methode des NativeDetaillierte Erläuterung der Prinzipien der Java-ReflexionsimplementierungsmethodeImpl-Objekts auf :

Der inflationThreshold in der ReflectionFactory-Klasse wird hier verwendet. Nachdem der Delegat die Aufrufmethode 15 Mal aufgerufen hat, wird das Detaillierte Erläuterung der Prinzipien der Java-ReflexionsimplementierungsmethodeImpl-Objekt über die genericMethod generiert Methode der Detaillierte Erläuterung der Prinzipien der Java-ReflexionsimplementierungsmethodeGenerator-Klasse und als Delegate-Objekt festgelegt, sodass die Methode beim nächsten Aufruf ausgeführt wird, wird die Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode()-Methode des neu erstellten Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode-Objekts aufgerufen. Hier ist zu beachten, dass die Methode „generateMethod“ beim Generieren eines Detaillierte Erläuterung der Prinzipien der Java-ReflexionsimplementierungsmethodeImpl-Objekts den entsprechenden Bytecode im Speicher generiert und ClassDefiner.defineClass aufruft, um das entsprechende Klassenobjekt zu erstellen. Die Implementierung lautet wie folgt:

Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

In der Implementierung der ClassDefiner.defineClass-Methode wird bei jedem Aufruf ein Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode-Klassenladeobjekt generiert:

Detaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode

Eine neue Klasse Der Loader wird hier jedes Mal generiert. Aus Leistungsgründen können diese generierten Klassen in einigen Fällen entladen werden, da das Entladen von Klassen nur dann recycelt werden kann, wenn der ursprüngliche Klassenlader verwendet wird Dies kann dazu führen Diese neu erstellten Klassen sollen niemals entladen werden. Aus gestalterischer Sicht möchten wir nicht, dass diese Klassen immer im Speicher vorhanden sind.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Prinzipien der Java-Reflexionsimplementierungsmethode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn