Nachteile der Reflexion im Allgemeinen
Reflexion ist schwerer zu verstehen als linearer Code.
Meiner Erfahrung nach ist Reflektion in Java ein Feature auf Expertenebene. Ich würde argumentieren, dass die meisten Programmierer Reflection niemals aktiv verwenden (dh Bibliotheken, die Reflection verwenden, werden nicht gezählt). Für diese Programmierer ist die Verwendung von Code daher schwieriger zu verstehen.
Der Reflektionscode ist für die statische Analyse nicht zugänglich
Angenommen, ich habe einen Getter getFoo
in meiner Klasse und möchte ihn in umbenennen getBar
. Wenn ich keine Reflektion verwende, kann ich einfach die Codebasis durchsuchen getFoo
und jeden Ort finden, der den Getter verwendet, damit ich ihn aktualisieren kann, und selbst wenn ich einen vermisse, wird der Compiler sich beschweren.
Aber wenn der Ort, an dem der Getter verwendet wird, so ähnlich ist wie callGetter("Foo")
und callGetter
ist getClass().getMethod("get"+name).invoke(this)
, wird er von der obigen Methode nicht gefunden und der Compiler wird sich nicht beschweren. Nur wenn der Code tatsächlich ausgeführt wird, erhalten Sie eine NoSuchMethodException
. Und stellen Sie sich den Schmerz vor, den Sie verspüren, wenn diese Ausnahme (die nachverfolgt wird) verschluckt wird, callGetter
weil "sie nur mit hartcodierten Zeichenfolgen verwendet wird, sie kann eigentlich nicht passieren". (Niemand würde das tun, könnte jemand argumentieren? Außer dass das OP genau das in seiner SO-Antwort getan hat . Wenn das Feld umbenannt wird, würden Benutzer des generischen Setters es nie bemerken, außer dass der äußerst obskure Fehler des Setters im Stillen nichts tut. Benutzer des Getters können, wenn sie Glück haben, die Konsolenausgabe der ignorierten Ausnahme bemerken.)
Der Reflektionscode wird vom Compiler nicht typgeprüft
Dies ist im Grunde ein großer Unterpunkt des oben Gesagten. Reflexionscode dreht sich alles um Object
. Typen werden zur Laufzeit geprüft. Fehler werden durch Unit-Tests entdeckt, aber nur, wenn Sie Abdeckung haben. ("Es ist nur ein Getter, ich muss es nicht testen.") Grundsätzlich verlieren Sie den Vorteil, den Sie durch die Verwendung von Java gegenüber Python gewonnen haben.
Der Reflektionscode ist für die Optimierung nicht verfügbar
Vielleicht nicht in der Theorie, aber in der Praxis werden Sie keine JVM finden, die einen Inline-Cache für Inlinespeicher erstellt Method.invoke
. Für solche Optimierungen stehen normale Methodenaufrufe zur Verfügung. Das macht sie viel schneller.
Der Reflektionscode ist im Allgemeinen nur langsam
Die für den Reflection-Code erforderliche dynamische Methodensuche und Typprüfung ist langsamer als normale Methodenaufrufe. Wenn Sie diesen billigen Einzeilen-Getter in ein Reflexionstier verwandeln, könnten Sie (ich habe dies nicht gemessen) mehrere Größenordnungen der Verlangsamung betrachten.
Nachteil der generischen Getter / Setter speziell
Das ist nur eine schlechte Idee, da Ihre Klasse jetzt keine Kapselung mehr hat. Jedes Feld ist zugänglich. Sie können sie auch alle öffentlich machen.