2015-04-27 3 views
15

Wie finde ich eine anonyme innere Klasse, wenn ich bei Verwendung von Eclipse nur den Namen der Klasse Class$N erhalten habe, ohne den Code durchzugehen und jede anonyme Klasse zu zählen? Gibt es eine Funktion zum Springen zur anonymen Klassendeklaration, in die ich die $ Suffixnummer eingeben kann?

Die Suche-> Java-Funktion war nicht hilfreich.

Ich verwende VisualVM, um CPU-Hotspots zu finden. Mein Hotspot befindet sich in einer anonymen Klasse namens SomeClass $ 5. VisualVM kann die Quelle für meine Klasse nicht finden, und ich (und andere) kann nicht finden, wie die Quelle an VisualVM angefügt wird, gezeigt here und here. Das Launcher-Plugin löst das nicht. Die Zählung der anonymen Deklarationen ist keine Option, da auf lange Sicht das Risiko menschlicher Fehler beim Sortieren durch Hunderte von Zeilen dazu führen kann, dass viel Zeit damit verschwendet wird, an der falschen anonymen Klasse zu arbeiten, nur um herauszufinden, dass dies der Fall war die falsche Klasse.

Als Workaround teste ich die Klassen mit 'System.out.println("this="+this.getClass().getName());' in einer Methode, um sicherzustellen, dass es die richtige ist, aber es muss einen besseren Weg geben.

+0

Große Frage. Ich kenne zwei Wege: Zählen (was fehleranfällig ist) und der Klasse einen Namen geben (d. H. Eine anonyme Klasse in eine innere Klasse verwandeln), die die Vorteile der anonymen Klasse ruiniert. Und wenn ich an Java 8 denke ... sollte es einen besseren Weg geben. –

+4

Zwei weitere Möglichkeiten, die Deklaration zu finden: 'Class.forName (" SomeClass $ 5 "). GetEnclosingClass/Method/Constructor()' (kann jedoch mehrdeutig sein, wenn viele anonyme Klassen im selben Bereich vorhanden sind). 'javap -v SomeClass $ 5.class' und überprüfen Sie die LineNumberTable-Attribute der Methoden (aber möglicherweise nicht vorhanden, wenn die .class-Dateien ohne Debug-Informationen kompiliert oder verschleiert wurden). (Diese helfen nicht, Eclipse oder VisualVM automatisch Ihren Code zu finden. Beantworten Sie die Frage also nicht wie angegeben.) –

+1

Nur Infos zu YourKit Java Profiler: "... Beachten Sie die äußerst nützliche Fähigkeit, den Code anonymer Klassen und deren Methoden, was manuell sehr schwierig ist. " [link] {https://www.yourkit.com/docs/80/help/eclipse.jsp} –

Antwort

3

Ich weiß nicht, wie das in Eclipse zu tun, aber ich kann zwei andere Möglichkeiten anbieten, um die Deklaration zu finden.


können Sie Class.forName("SomeClass$5") nennen, dann eines von Class.getEnclosingMethod oder Class.getEnclosingConstructor oder Class.getEnclosingClass rufen seine unmittelbar umschließenden Definition zu finden. Dies kann mehrdeutig sein, wenn sich mehrere anonyme Klassen im selben umschließenden Member befinden, aber Sie können damit beginnen, nachzusehen.


Sie können die kompilierten Klassendatei mit dem javap Werkzeug mit javap -v SomeClass$5.class zerlegen. Wenn die Klassendatei mit Debuginformationen kompiliert wurde und die anonyme Klasse mindestens eine Methodendefinition enthielt, geben die -Attribute dieser Methodendefinition (en) an, wo sie in der Quelldatei definiert waren. Das SourceFile Attribut enthält den Quelldateinamen. Das EnclosingMethod Attribut wird die umschließende Methode benennen (wenn es eine gibt), und das InnerClasses Attribut wird Informationen über umschließende und innere Klassen (einschließlich nicht verwandte Klassen, die nur verwendet werden, so seien Sie vorsichtig beim Dolmetschen) haben.

Verwandte Themen