2010-06-24 13 views
7

Ich arbeite an einer Analyse für Java-Programme, die Nebeneffekt Informationen über Methodenaufrufe erfordert. Für Standardbibliotheksklassen möchte ich eine Liste von Methoden mit schreibgeschützten Parametern erstellen. Das heißt, Methoden, die ihre Argumente oder irgendetwas, das von ihren Argumenten erreichbar ist, nicht modifizieren. Ich kann viel von den Javadocs ableiten, aber das wird Zeit brauchen.Nebenwirkungen freie Methoden in der Java-Standardbibliothek

Kann jemand eine einfachere Referenz oder Methode vorschlagen, um zu bestimmen, ob Standardmethodenaufrufe ihre Argumente ändern? Ist das Lesen der einzelnen javadoc-Einträge wirklich der beste Weg?

Danke!

EDIT: Ein Bonus wäre die Identifizierung von Methoden, die keine Nebenwirkungen auf das Objekt haben. Zum Beispiel würde stack.pop() während stack.size() nicht.

+1

Ich wäre daran interessiert, Ihre Lösung zu sehen. Sie können davon ausgehen, dass alle Methoden, die unveränderliche Typen verwenden, nebenwirkungsfrei sind. Nicht sicher, was Sie außer Javadocs und Code noch können. –

+0

@SB: Denken Sie daran, dass "String" unveränderlich ist, aber Klassen, die 'CharSequence 'implementieren, können oder auch nicht sein. – Powerlord

Antwort

1

Nun, alle Methoden, die nur primitive Typen/Strings/Object/generische Typen als Parameter verwenden, sollten Sie ohne weitere Überlegung zufriedenstellen. Und für java.lang und java.util sollte dies die meisten Methoden abdecken.

Aber Sie sollten wirklich Pakete zu begrenzen, die Sie verarbeiten möchten, weil Standard-JDK riesige Bibliothek von Klassen für alle Aufgaben und Zwecke bietet.

bearbeiten
Es ist etwas unschärfer für generische Typen wie E extends ModifiableObject erklärt, so für sich selbst sehen.

+0

Das ist ein guter Vorschlag als Ausgangspunkt, danke. – Owen

1

Sie könnten versuchen, eine Typ-Inferenz-Engine gegen den Quellcode des JDK auszuführen.

Vielleicht kann das Papier Type qualifier inference for Java von Nutzen sein. (Der vollständige Text scheint jedoch nicht online zu sein.)

1

Unser DMS Software Reengineering Toolkit ist ein universell anpassbares Programm zur Analyse und Transformation von Programmen. Es hat eine Java Front End, die Java analysiert und Symboltabellen, Klassenvererbungsbeziehungen, Kontroll- und Datenflussinformationen erzeugt.

Aus dieser Information können lokale Informationen darüber berechnet werden, ob eine Methode M direkt ein Argument oder irgendetwas, das von einem Argument erreichbar ist, ändert. Ein Aufrufgraph kann konstruiert werden, und alles, was mit einer Methode X modifiziert wurde, die direkt oder indirekt von M aufgerufen wird. Das ist tatsächlich Ihre Antwort. Sie müssen dies auf die Quelle des gewünschten Codes anwenden, in Ihrem Fall auf die Java-Standardbibliothek.

Die Konfiguration von DMS ist nicht trivial, auch nicht mit allen gelieferten Informationen. OTOH, diese Antwort wird ziemlich genau sein (modulo-konservative Annahmen und Reflektion), wiederholbar und leicht auf jede von Ihnen gewählte Methode anzuwenden. Dies per Hand über Javadocs zu tun ist wahrscheinlich sehr zeitaufwendig und fehleranfällig.