Java: einfachste Möglichkeit, Java 1.5 und 1.6 Code zu packen

8

Ich möchte ein Stück Code packen, das absolut muss auf Java 1.5 ausgeführt werden. Es gibt einen Teil des Codes, in dem das Programm "erweitert" werden kann, wenn die VM eine 1.6 VM ist.

Grundsätzlich ist es diese Methode:

%Vor%

Was wäre der einfachste Weg, diese -Kompilierung auf 1.5 zu haben und die 1.6-Methodenaufrufe bei 1.6 auszuführen?

?

In der Vergangenheit habe ich etwas Ähnliches gemacht, indem ich eine einzigartige 1.6 Klasse kompiliert habe, die ich mit meiner App verpacke und mit einem ClassLoader in Version 1.6 instanziiere (weil eine 1.6 JVM perfekt ist, 0x32 und 0x31 Klassen zu mischen), aber ich denke, es ist ein bisschen übertrieben (und ein bisschen schmerzhaft, weil während des Build-Prozesses müssen Sie 0x31 und 0x32 .class-Dateien erstellen).

Wie soll ich gehen, wenn ich die obige Methode auf 1.5 kompilieren wollte? Vielleicht mit Reflektion aber dann wie (ich bin überhaupt nicht mit Reflektion vertraut)

Hinweis: Wenn Sie neugierig sind, kommt die obige Methode aus diesem Artikel: Ссылка

(aber ich möchte nicht "die drei Zeilen kommentieren" wie im Artikel, ich möchte, dass dies sowohl auf 1.5 als auch auf 1.6 kompiliert wird)

    
SyntaxT3rr0r 15.03.2010, 16:11
quelle

3 Antworten

3

Sie können dies nicht in 1.5 kompilieren, aber Sie können mit 1.6 kompilieren, wobei die Zieloption auf 1.5 gesetzt ist (das würde Byte-Code für 1.5 erzeugen) und im Code mit Reflektion, um herauszufinden, ob die Methode verfügbar ist / p>

Dieser Code sucht nach der Methode:     mbean.getClass (). getMethod ("findDeadlockedThreads", neue Klasse [0]); Problem ist, dass es eine NoSuchMethodException auslöst, wenn die Methode nicht vorhanden ist, anstatt einfach null oder etwas Ähnliches zurückzugeben. Das heißt, Sie brauchen Code wie folgt:

%Vor%

Das ist nicht sehr nett, weil es eine Ausnahme verwendet, um eine Entscheidung zu treffen. Das ist wahrscheinlich nicht sehr schnell. Eine Alternative besteht darin, stattdessen getMethods zu verwenden und die zurückgegebene Liste zu durchlaufen, wenn Ihre Methode verfügbar ist. Das ist auch nicht sehr schnell.

BEARBEITEN: Christopher Oezbek schlägt in den Kommentaren vor, die Existenz der Methode nur einmal zu überprüfen und das Ergebnis zu speichern, um den Overhead für den Try-Catch-Block zu vermeiden. Das ist richtig und eine gute Lösung. matt b warnt, dass die target-Option des Java-Compilers nicht prüft, ob die verwendeten Klassen und Methoden unter Java 1.5 verfügbar sind. Das ist richtig (und sonst würde es nicht funktionieren, weil Sie gegen eine 1.6-Methode kompilieren wollen) und das bedeutet, dass das Programm sorgfältig unter einer 1.5-VM getestet werden sollte, um dieses Problem zu vermeiden. Vielen Dank für Ihre Kommentare von Ihnen.

    
Mnementh 15.03.2010, 16:16
quelle
2

Kompiliere für 1.5.

Verwenden Sie in Ihrem Code Reflexion. Sie können das Method-Objekt über die Klassenschnittstelle abrufen. Es verfügt über eine Aufrufmethode, die Ihre mbean-Instanz als Parameter verwendet. Etwas wie das:

Klasse c = mbean.getClass (); // kann YourClass.class auch tun, um das zu bekommen

Methode m = c.getMethod ("findMonitorDeadLockedThreads"); // oder eine andere Methode (Parameter zu Die Methode wird mit Class ... second Parameter to getMethod)

angegeben

m.invoke (mbean) // ruft die Methode mit Ihrer Instanz auf

Natürlich müssen Sie das nicht jedes Mal machen; Richten Sie die Methodenreferenzen in einem Konstruktor ein und rufen Sie dann bei Bedarf einfach die richtige Methode auf.

    
danpaq 15.03.2010 16:17
quelle
1

Mit Maven können Sie das ganz einfach mit Profilen machen. Die Idee hinter den Profilen ist, dass Sie basierend auf einigen Kriterien zwei verschiedene Versionen von etwas erstellen möchten. In diesem speziellen Beispiel können Sie ein jdk15 - und ein jdk16 -Profil definieren, angeben, mit welcher JDK-Version jedes kompiliert werden soll, und eine Kopie der Klasse im jdk15-Profil und die andere in jdk16 angeben.

Um zu beginnen, sehen Sie:

Ссылка

Hier wird beschrieben, wie der JDK-Versionsteil des Problems ausgeführt wird.

Um den zweiten Teil des Problems zu behandeln, verwenden Sie eine andere Definition der Klasse in Abhängigkeit von der JDK-Version:

Maven - Verschiedene Dateien zur Build-Zeit einschließen

>     
James Kingsbery 15.03.2010 16:18
quelle

Tags und Links