2565 Stimmen

Was ist Reflexion und warum ist sie nützlich?

Was ist Reflexion, und warum ist sie nützlich?

Ich interessiere mich besonders für Java aber ich gehe davon aus, dass die Grundsätze in jeder Sprache die gleichen sind.

19voto

pramod Punkte 171

Nach meinem Verständnis:

Reflection ermöglicht es dem Programmierer, dynamisch auf Entitäten im Programm zuzugreifen, d.h. wenn der Programmierer während der Programmierung einer Anwendung eine Klasse oder ihre Methoden nicht kennt, kann er diese Klasse dynamisch (zur Laufzeit) nutzen, indem er Reflection verwendet.

Sie wird häufig in Szenarien verwendet, in denen sich ein Klassenname häufig ändert. Wenn eine solche Situation eintritt, ist es für den Programmierer kompliziert, die Anwendung neu zu schreiben und den Namen der Klasse immer wieder zu ändern.

Durch die Verwendung von Reflection muss man sich stattdessen keine Gedanken über einen sich möglicherweise ändernden Klassennamen machen.

19voto

roottraveller Punkte 7134

Reflexion ist eine API, die dazu dient, das Verhalten von Methoden, Klassen, Schnittstellen zur Laufzeit.

  1. Die erforderlichen Klassen für die Reflexion finden Sie unter java.lang.reflect package .
  2. Reflection gibt uns Informationen über die Klasse, zu der ein Objekt gehört, und auch über die Methoden dieser Klasse, die mit Hilfe des Objekts ausgeführt werden können.
  3. Durch Reflexion können wir Methoden zur Laufzeit aufrufen, unabhängig vom Zugriffsspezifizierer, der für sie verwendet wird.

Le site java.lang et java.lang.reflect Pakete bieten Klassen für Java Reflection.

Reflexion kann verwendet werden, um Informationen über -

  1. Klasse Die getClass() Methode wird verwendet, um den Namen der Klasse zu ermitteln, zu der ein Objekt gehört.

  2. Konstrukteure Die getConstructors() wird verwendet, um die öffentlichen Konstruktoren der Klasse zu ermitteln, zu der ein Objekt gehört.

  3. Methoden Die getMethods() Methode wird verwendet, um die öffentlichen Methoden der Klasse zu erhalten, zu der ein Objekt gehört.

Le site Reflexions-API wird hauptsächlich verwendet in:

IDE (Integrierte Entwicklungsumgebung), z. B. Eclipse, MyEclipse, NetBeans usw.
Debugger und Testwerkzeuge usw.

Vorteile der Verwendung von Reflexion:

Erweiterungsmöglichkeiten: Eine Anwendung kann externe, benutzerdefinierte Klassen verwenden, indem sie Instanzen von Erweiterungsobjekten unter Verwendung ihrer vollqualifizierten Namen erzeugt.

Debugging- und Testwerkzeuge: Debugger verwenden die Eigenschaft der Reflexion, um private Mitglieder von Klassen zu untersuchen.

Nachteilig:

Performance Overhead: Reflektierende Operationen sind langsamer als ihre nicht-reflektierenden Gegenstücke und sollten in Codeabschnitten, die in leistungsempfindlichen Anwendungen häufig aufgerufen werden, vermieden werden.

Offenlegung von Interna: Reflektierender Code bricht Abstraktionen auf und kann daher bei Upgrades der Plattform sein Verhalten ändern.

Ref: Java-Reflexion javarevisited.blogspot.in

18voto

Jorge Córdoba Punkte 49057

Reflection ist eine Reihe von Funktionen, mit denen Sie auf die Laufzeitinformationen Ihres Programms zugreifen und dessen Verhalten (mit einigen Einschränkungen) ändern können.

Es ist nützlich, weil es Ihnen ermöglicht, das Laufzeitverhalten in Abhängigkeit von den Metainformationen Ihres Programms zu ändern, d.h. Sie können den Rückgabetyp einer Funktion überprüfen und die Art und Weise ändern, wie Sie die Situation behandeln.

In C# können Sie zum Beispiel eine Assembly (eine .dll) zur Laufzeit laden und untersuchen, durch die Klassen navigieren und je nach Ergebnis Aktionen ausführen. Sie können auch eine Instanz einer Klasse zur Laufzeit erstellen, ihre Methode aufrufen usw.

Wo kann sie nützlich sein? Ist nicht immer nützlich, aber für konkrete Situationen. Zum Beispiel können Sie es verwenden, um den Namen der Klasse für Protokollierungszwecke zu erhalten, um dynamisch Handler für Ereignisse zu erstellen, je nachdem, was in einer Konfigurationsdatei angegeben ist und so weiter...

14voto

catch23 Punkte 15336

Ich möchte nur einige Punkte zu all dem, was aufgelistet wurde, hinzufügen.

Mit Reflexions-API können Sie universell schreiben toString() Methode für jedes Objekt.

Es ist nützlich bei der Fehlersuche.

Hier ist ein Beispiel:

class ObjectAnalyzer {

   private ArrayList<Object> visited = new ArrayList<Object>();

   /**
    * Converts an object to a string representation that lists all fields.
    * @param obj an object
    * @return a string with the object's class name and all field names and
    * values
    */
   public String toString(Object obj) {
      if (obj == null) return "null";
      if (visited.contains(obj)) return "...";
      visited.add(obj);
      Class cl = obj.getClass();
      if (cl == String.class) return (String) obj;
      if (cl.isArray()) {
         String r = cl.getComponentType() + "[]{";
         for (int i = 0; i < Array.getLength(obj); i++) {
            if (i > 0) r += ",";
            Object val = Array.get(obj, i);
            if (cl.getComponentType().isPrimitive()) r += val;
            else r += toString(val);
         }
         return r + "}";
      }

      String r = cl.getName();
      // inspect the fields of this class and all superclasses
      do {
         r += "[";
         Field[] fields = cl.getDeclaredFields();
         AccessibleObject.setAccessible(fields, true);
         // get the names and values of all fields
         for (Field f : fields) {
            if (!Modifier.isStatic(f.getModifiers())) {
               if (!r.endsWith("[")) r += ",";
               r += f.getName() + "=";
               try {
                  Class t = f.getType();
                  Object val = f.get(obj);
                  if (t.isPrimitive()) r += val;
                  else r += toString(val);
               } catch (Exception e) {
                  e.printStackTrace();
               }
            }
         }
         r += "]";
         cl = cl.getSuperclass();
      } while (cl != null);

      return r;
   }    
}

12voto

Marcus Thornton Punkte 5451

Reflexion bedeutet, das Objekt sein Aussehen sehen zu lassen. Dieses Argument scheint nichts mit Reflexion zu tun zu haben. In der Tat ist dies die "Selbst-Identifizierung" Fähigkeit.

Reflexion selbst ist ein Wort für solche Sprachen, denen es an der Fähigkeit zur Selbsterkenntnis und Selbsterkenntnis fehlt, wie Java und C#. Da sie die Fähigkeit der Selbsterkenntnis nicht besitzen, müssen wir, wenn wir beobachten wollen, wie es aussieht, eine andere Sache haben, um zu reflektieren, wie es aussieht. Ausgezeichnete dynamische Sprachen wie Ruby und Python können ihre eigene Reflexion ohne die Hilfe anderer Individuen wahrnehmen. Wir können sagen, dass ein Objekt in Java ohne einen Spiegel, der ein Objekt der Reflexionsklasse ist, nicht wahrnehmen kann, wie es aussieht, aber ein Objekt in Python kann es ohne einen Spiegel wahrnehmen. Deshalb brauchen wir die Reflexion in Java.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X