2016-06-27 4 views
-1

Ich bin jetzt seit drei Tagen gerade dabei und kann keine Antwort finden. Brauchen Sie den Rat einiger erfahrener Leute. :)Alle Schnittstellenmethoden können nicht überschrieben werden.

Wir hatten einen Programmierer verlassen uns Jahre zurück. Alles, was wir haben, ist eine .jar-Datei und keine Originalquelle. Um kleinere Anpassungen an diesem .jar vorzunehmen, habe ich einen Decompiler ausgeführt und eine eigene Klassendatei eingefügt und eine der vorhandenen Klassendateien in der .jar-Datei geändert, um sie aufzurufen. Es war eine einfache Möglichkeit, Code, den wir an einem bestimmten Punkt in der Anwendung benötigten, einzufügen (diese Sache ist riesig, so dass das gesamte Projekt ein wenig entmutigend und fehleranfällig ist). Das alles hat in den letzten Jahren gut funktioniert. Aber letzte Woche dachte ich, wir brauchten einen Thread, um die Dinge effizienter zu machen ...

Der Code bricht komplett fehlerfrei ab, sobald er die Thread-Initialisierung erreicht. Ich verengte es weiter auf die eigentliche Runnable-Initialisierung und dann auf scheinbar jede Schnittstelle, die ich versuche. Da ich innerhalb einer vorhandenen JAR-Datei laufe, habe ich keinen Debug-Zugriff, außer in eine eigene Protokolldatei zu schreiben. So kann ich vor der Runnable-Initialisierung eine Protokollzeile schreiben und danach kommt nichts mehr.

So ein Anruf ein lauffähiges Variable zu setzen:

Runnable r; 

scheint es in Ordnung, so ist kein Problem mit ihm die Referenz zu finden. Sobald ich die Methode überschreibe und überspringe:

Die Ausgabe in meine Protokolldatei unterhalb dieser Zeile wird nie erreicht. Damit. Ich dachte mir, vielleicht ist es ein Zugriffsmodifikator Problem aus welchem ​​Grund auch immer. So überprüfte ich es zur Laufzeit:

Method[] methods = Runnable.class.getDeclaredMethods(); 
for (int i = 0; i < methods.length; i++) { 
    writeToLog("public method: " + methods[i]); 
} 

und ich am Ende mit:

"public-Methode: public void java.lang.Runnable.run()"

Was mir zugänglich sieht ...

Kann mir jemand einen Einblick geben, WARUM das scheitern könnte? Ich würde annehmen, dass dies eine unkontrollierte Ausnahme ist, andernfalls sollte mein try/catch darum herum in meinem Log ausgeben. Wenn ich nur die Fähigkeit hätte, es zu debuggen. Ich habe sogar Remote-Debugger-Optionen ausprobiert, aber es scheint nichts auszugeben. Vielleicht gibt es eine interne Fehlerbehandlung in diesem Jar, die alles außer Kraft setzt. Vielleicht habe ich so lange daran gearbeitet, dass ich komplett falsch gelaufen bin, um das herauszufinden!

All mein Code ist bereit zu gehen Ich muss es nur in einem blutigen Runnable stecken! So frustrierend :) Vielen Dank im Voraus!

tldr: Ich füge eine Klassendatei in ein bestehendes Jar ein, weil ich keinen Quellzugriff habe. Alle Code läuft gut, aber keine Interface-Methoden können (Runnable insbesondere) überschrieben werden, und ich kann nicht herausfinden, warum, weil ich habe keine Debug-Zugriff entweder

Update Danke für die IntelliJ IDE Vorschlag @mikibrv. Ich habe jetzt eine Fehlermeldung:

java.lang.NoClassDefFoundError 

Irgendwelche Ideen, warum die Klasse nicht definiert werden, wenn ich es eindeutig und seine öffentliche Methode finden kann?

Antwort

3

Wenn Sie Maven verwenden, können Sie versuchen, das JAR in Ihrem lokalen Maven-Repository zu installieren und es als Abhängigkeit zu einem Projekt hinzuzufügen. Dann können Sie die Klassen in einem neuen Projekt tatsächlich verwenden und erweitern.

So: https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html

Auch IDE wie IntelliJ für Ihr die JAR in der Lage für einen einfachen Zugang zu dekompilieren. Und sogar debuggen Sie es

Eine andere Idee wäre, jede Klasse zu nehmen, seit Sie dekompiliert und neu kompiliert sie mit einer neueren Version von Java. Wahrscheinlich wurde das Jar mit einer älteren Version von Java kompiliert.

+2

Und starten Sie mit Git und einem Code-Repository für Sake –

+0

Es stimmt über die Compiler-Version. Es war ein Java 6 Build. Aus Gründen, die ich nicht kontrollieren kann, muss ich es jedoch als Java 6 behalten. Ich habe noch nichts von IntelliJ gehört, aber ich lade es jetzt herunter, um es zu versuchen. Aber können Sie sich inzwischen vorstellen, warum eine lauffähige Initialisierung so fehlschlagen würde? Gibt es eine inhärente Java-Sicherheit, von der ich nicht weiß, dass sie von einem bereits kompilierten .jar aktiv ist? Ich verstehe es einfach nicht. – Liam

+0

@mikibrv Intellij für den Sieg! Danke für diesen Rat. Diese IDE ist episch. Ich habe noch nie davon gehört. Ich habe jetzt zumindest eine Fehlermeldung: java.lang.NoClassDefFoundError. Ich habe Forschung zu tun ... Irgendwelche Ideen, warum dies der Fehler wäre? – Liam