Muss ich mich mit der Situation befassen, in der private Methoden durch Reflektion aufgerufen werden?

12

Muss ich beim Erstellen einer Bibliothek sicherstellen, dass die privaten Methoden wie erwartet funktionieren, wenn sie nicht von anderen Methoden derselben Klasse, sondern von einer anderen Bibliothek durch Reflektion aufgerufen werden ?

Wenn beispielsweise eine private Methode private DoSomething(int number)Folgendes erwartet:

  • number ist eine positive Ganzzahl ungleich Null und:
  • Eine private Variable string abcist nicht null und keine leere Zeichenfolge.

und vollständig, hässlich schlägt fehl , wenn diese beiden Bedingungen nicht übereinstimmen, muss ich diese Ausfälle behandeln , auch wenn ich weiß , dass alle Methoden in der Klasse wird always¹ assign eine nicht leere Wert abcvor dem Aufruf DoSomething, und übergeben Sie eine positive ganze Zahl ungleich Null auf diese Methode?

Mit anderen Worten, kann der Code, der nicht durch Reflektion vor unsicheren Anrufen geschützt ist, als Code geringer Qualität betrachtet werden , oder gehört er dem Anrufer, der Reflektion verwendet, um sicherzustellen, dass der Anruf nichts unterbricht?

Hinweis: Meine Frage deckt nur einen Standardsatz von Bibliotheken ab. Dies gilt nicht für Code, der sehr sicher sein muss (z. B. wenn jemand Interesse daran hat, Reflektion zu verwenden, damit er sich unerwartet verhält oder abstürzt).


¹ Weil die Klasse korrekt dokumentiert ist, weil es genügend Komponententests gibt, um sicherzustellen, dass kein anderer Entwickler diese Methode durchbricht usw.

Arseni Mourzenko
quelle
Können abgeleitete Klassen die privaten Methoden aufrufen?
Oenone

Antworten:

16

Indem Sie Ihre Methode als privat markieren, haben Sie Ihre Absichten und einen Vertrag festgelegt. Durch die Verwendung von Reflection kann ein Kundencode gegen diesen Vertrag verstoßen und muss folglich die Konsequenzen tragen. Dasselbe passiert mit Protokollen, denn die Regeln für das Funktionieren müssen befolgt werden, sonst werden schlimme Dinge passieren.

Das gleiche Problem kann bei anderen Sprachen wie C ++ auftreten, bei denen ich solche Dinge gesehen habe

#define private public

Fazit: Sie müssen NICHT mit diesen Situationen umgehen, der Anrufer sollte es besser wissen.

Otávio Décio
quelle
3
Ich habe gesehen, wie Leute Klassen in (unsigned char *) umwandelten und direkt in den Speicheroffset einer Mitgliedsvariablen schrieben, die sie ändern möchten. Meine Augen bluteten.
Shawn D.
6
Ich würde hinzufügen, dass es im Wesentlichen unmöglich ist , Ihre Klasse vor gefährlichem privilegiertem Code zu schützen . Wenn Sie es irgendwie schaffen, sich vor unangemessener Verwendung von Reflexion zu schützen, wird jemand einen anderen Weg finden, um Ihren Tag zu ruinieren, möglicherweise indem Sie einfach Ihren Prozessspeicher direkt überschreiben. Die defensive Codierung erreicht schließlich einen Punkt mit abnehmenden Erträgen, und die Reflexion ist weit über diesen Punkt hinaus.
Aaronaught
5

Wenn jemand Reflection verwendet, um Ihre privaten Methoden aufzurufen, ist dies ein Zeichen dafür, dass jemand etwas falsch macht. Entweder verwendet er den Code auf eine Weise, für die er nicht entwickelt wurde, oder Sie verstecken zu viel von der internen Arbeitsweise und machen die API unsichtbar.

Aber es hört sich so an, als wären Sie noch nicht einmal in diesem Stadium und versuchen nur, vorbeugend vorzugehen. Meine Meinung ist also: Mach dir keine Sorgen. Eine private Methode sollte als tabu angesehen werden. Wenn jemand absichtlich diese Grenzen überschreitet, dann ist es ihr Problem, wenn die Dinge explodieren.

Mike Baranczak
quelle
0

Nun, es ist immer eine gute Idee, nicht-lokale Variablen zu validieren, bevor Sie sie verwenden, aber ansonsten würde ich mir darüber keine Sorgen machen. Wie die anderen sagten, haben Sie Ihre Absichten begründet, indem Sie die Methode zunächst als privat deklariert haben. Jeder, der von außerhalb Ihrer Klasse anruft, hat keine Garantie. Wenn ich in Java arbeite, schreibe ich nicht einmal Javadoc-Kommentare zu meinen privaten Methoden, weil ich nicht möchte, dass andere Entwickler überhaupt wissen, dass sie da sind.

TMN
quelle