[JAVA] Kraftfertigkeiten, die jederzeit schnell eingesetzt werden können - Reflexion

Was ist Reflexion?

Reflection ist eine Gruppe von APIs, die in der Java-Standardbibliothek zur Verarbeitung von Metainformationen von Klassen enthalten sind und im Paket "java.lang.reflect" zusammengefasst sind.

Mit Reflection können Sie eine Liste der in einer Klasse definierten Konstruktoren, Methoden und Felder lesen, Methoden daraus aufrufen und Feldwerte abrufen. Normalerweise reicht es aus, eine Instanz direkt zu erstellen und eine Methode ohne Reflektion aufzurufen. Mit Reflection können Sie jedoch Betrugstechniken ausführen, z. B. auf unsichtbare Methoden zugreifen und "final" -Felder ändern. Werden.

Was kann man mit Reflexion machen?

Alle Typen haben ein Literal namens ".class". String.class gibt Ihnen eine Class-Klasse mit Informationen zur String-Klasse. Die Klasse "Klasse" enthält eine Methode zum Suchen, welche Methode in der Zielklasse definiert ist, und eine Methode zum Abrufen von Informationen zu dem definierten Feld. Außerdem ist getClass () in allen Klassen als Instanzmethode definiert, und Sie können diese Methode auch verwenden, um die Klasse Class abzurufen.

Im Folgenden können Sie beispielsweise die ursprünglich unsichtbaren Methoden aufrufen, die in "privat" definiert sind.

//Eine Klasse, auf die durch Reflexion zugegriffen wird.
public class Something {
  private String hoge() {
    return "hoge";
  }
}

public class Main {
  public static void main(String[] args) {
    Something target = new Something();

    try {
      Class<Something> clazz = target.getClass();            //Da Klasse ein reserviertes Wort ist, ist es üblich, clazz oder klass zu verwenden.
      Method method = clazz.getDeclaredMethod("hoge", null); //Das zweite Argument ist ein Array von Argumenttypen für die aufzurufende Methode. Auf null setzen, wenn nicht vorhanden
      method.setAccessible(true);                            //Eine magische Methode, die eine Methode sichtbar macht, die nicht sichtbar sein sollte
      String result = (String) method.invoke(target, null);  //Die Instanz, die die Methode im ersten Argument aufruft, das eigentliche Argument nach dem zweiten Argument
      System.out.println(result);                            // "hoge"Wird ausgegeben
    } catch (NoSuchMethodException e) {
      //Wenn es keine Methode gibt, die mit dem in der Zeichenfolge angegebenen Methodennamen übereinstimmt
    } catch (InvocationTargetException e) {
      //Wenn in der aufgerufenen Methode eine Ausnahme auftritt
    } catch (IllegalAccessException e) {
      //Beim Zugriff auf eine unzugängliche Methode
    }
  }
}

Sei vorsichtig mit dem Nachdenken

Bei der Ausführung eines Programms, das Reflection verwendet, gelten für einige VMs strenge Regeln für den Zugriff durch Reflection. In diesem Fall löst der Aufruf von "setAccessible (true)" eine "SecurityException" aus. Darüber hinaus gibt Reflection die Namen aller Methoden, Klassen und Felder als Zeichenfolgen an. Daher gibt es eine Ausnahme, wenn diese Zeichenfolgen nicht übereinstimmen. Wenn Sie den Code mit ProGuard usw. verschleiern, müssen Sie daher vorsichtig mit dem Code sein, der Reflection verwendet (denn selbst wenn der Feldname oder der Methodenname geändert wird, wird die Zeichenfolge nicht geändert). Im Gegensatz zu normalen Methodenaufrufen wird die Reflection-API durchlaufen, was sich zwangsläufig auf die Leistung auswirkt.

Selbstverständlich können Sie zwangsweise auf Dinge zugreifen, auf die Sie normalerweise nicht zugreifen können, oder Sie können die Daten neu schreiben. Befolgen Sie daher die Dosierung und verwenden Sie sie korrekt.

Gibt es übrigens nicht viel Routinecode?

Ich werde sie alle zusammenfügen.

https://github.com/Drivemode/Intenso

Recommended Posts

Kraftfertigkeiten, die jederzeit schnell eingesetzt werden können - Reflexion
[ERROR-Meldungsanzeige] Einfache Version, die jederzeit mit der Schienen-Teilvorlage verwendet werden kann
Organisieren Sie Methoden, die mit StringUtils verwendet werden können
Über die Sache, dass hidden_field wahnsinnig benutzt werden kann
Praktische Tastenkombinationen für Eclipse
Erstellen Sie ein Seitensteuerelement, das mit RecyclerView verwendet werden kann
Firebase-Realtime-Datenbank für Android, die mit Kopie verwendet werden kann
Statisches Analysetool, das mit GitHub verwendet werden kann [Java-Version]
Zusammenfassung von ORM "uroboroSQL", das in Enterprise Java verwendet werden kann
SwiftUI-Ansicht, die in Kombination mit anderen Frameworks verwendet werden kann
Lock_version kann für Tabellen verwendet werden, die dazu neigen, gleichzeitig auf denselben Datensatz zuzugreifen und ihn zu bearbeiten
Eingabe / Ausgabe von Java-Dateien, die über den historischen Hintergrund verwendet werden können
Vielleicht kann es auf einer Jahresendparty verwendet werden? Mosaik-Spielcode
Einfache Implementierung eines Spielautomaten, die mit Kopie verwendet werden kann
[Rails] "Pry-Rails", die beim Speichern mit der create-Methode verwendet werden können
Tools zur Leistungsanalyse und Fehlerdiagnose, die mit OpenJDK verwendet werden können
Ruby-Array-Methoden, die mit Rails verwendet werden können (außer jedem)