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.
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.
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.
Reflexion ist eine API, die dazu dient, das Verhalten von Methoden, Klassen, Schnittstellen zur Laufzeit.
java.lang.reflect package
.Le site java.lang
et java.lang.reflect
Pakete bieten Klassen für Java Reflection.
Reflexion kann verwendet werden, um Informationen über -
Klasse Die getClass()
Methode wird verwendet, um den Namen der Klasse zu ermitteln, zu der ein Objekt gehört.
Konstrukteure Die getConstructors()
wird verwendet, um die öffentlichen Konstruktoren der Klasse zu ermitteln, zu der ein Objekt gehört.
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.
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...
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;
}
}
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 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.