7 Stimmen

Wie können neuere Versionen von Klassendateien mit Scala (50.0/51.0) ausgegeben werden?

Ich möchte die neue typprüfende Bytecode-Prüfung mit Klassen testen, die von scalac .

scalac gibt derzeit Klassendateien der Version 49.0 aus, aber die neue Typüberprüfung ist erst seit Version 51.0 obligatorisch.

Ich habe versucht, die Klassen mit ProGuard vorzuprüfen (was sie in der Tat in Version 50.0 konvertiert hat), aber ich bin mir nicht sicher, ob der neue Prüfer nicht automatisch auf den alten Typ-Inferenz-Prüfer zurückgreift.

Wie kann ich Klassendateien in die Version 51.0 konvertieren (oder wie kann ich herausfinden, welcher Verifier beim Laden von Klassendateien der Version 50.0 verwendet wird)?

2voto

Alex Cruise Punkte 7779

Es scheint, als hätte FJBG (die Bibliothek, die NSC zur Erzeugung von Bytecode verwendet) einige Bemühungen zur Unterstützung StackMap aber ich habe keine Ahnung, wie weit es schon ist.

Wenn Sie bei scala-internals nachfragen, könnte Stephane Michelou auftauchen. Er ist derjenige, der seit daran arbeitend .

1voto

v6ak Punkte 1606

Ich bin mir nicht sicher, aber ich denke, dass das Bytecode-Format nie tiefgreifend geändert wurde und dass es wahrscheinlich immer abwärtskompatibel ist. (Wenn Sie etwas über Bytecode wissen, erinnern Sie sich an die Longs und Doubles auf dem konstanten Pool und dem Operandenstapel, die ein bisschen verrückt entworfen wurden. Das ist doch nicht geändert worden, oder?) Das Ändern von Major/Minor-Nummern wird also wahrscheinlich funktionieren.

Wie kann man das tun? Es gibt zwei Möglichkeiten:

  • Verwenden Sie den Hexa-Editor und ändern Sie ihn manuell. Es sollte wirklich einfach sein, wenn Sie die Position der Bytes kennen. In der [Bytecode-Spezifikation][1] heißt es, dass die ersten vier Bytes übersprungen werden sollten und zwei Bytes der Minor-Version und zwei Bytes der Major-Version (in dieser Reihenfolge) angezeigt werden.
  • Verwenden Sie eine Bibliothek. Ich habe einige Erfahrung mit BCEL. Es scheint nicht die am besten gestaltete Bibliothek zu sein, die ich je gesehen habe, aber sie sollte für Ihren Fall gut genug sein. Ich habe Methoden setMinor und setMajor in einer Klasse gesehen (siehe ClassGen und die "fast-immutable" JavaClass).

[1] http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html

1voto

Matt Punkte 2101

Ich würde verwenden ASM um den Bytecode zu parsen. Ich weiß, dass Scala (und Clojure) ASM intern verwenden, so dass der Aufwand, um es zu lernen, nicht verschwendet werden. Sie können wahrscheinlich eine ClassReader und ein EmptyVisitor die die Besuchsmethode außer Kraft setzt, die relativ schnell Kopfzeileninformationen liefert.

0voto

Pere Villega Punkte 16419

Ich weiß, es ist vielleicht offensichtlich, aber ich bin mir nicht sicher, nachdem ich Ihre Frage gelesen habe, also werde ich fragen:

Verwenden Sie einen Beta-Build? Wie in einem der Nightly-Builds? Oder wollen Sie die aktuelle Version ändern?

EDIT: Ok, da ist etwas, was ich nicht verstehe. Ich habe gerade die nächtlichen Builds ausprobiert und ja, sie sind Version 49.0. Aber soweit ich weiß, wird dies durch den Compiler gesetzt.

Sie versuchen, die Version zu ändern, um Zugang zu einer neuen, ausgefallenen Funktion zu erhalten. Aber das ergibt für mich keinen Sinn. Wenn der Compiler die Version 49.0 herausgibt, sollte die Änderung auf eine neuere Version (50.0, 51.0 oder 70.0) keine Auswirkungen haben. Soweit ich weiß, soll die Version die Kompatibilität sicherstellen, was bedeutet, dass Sie eine neuere Klasse nicht mit einer älteren VM ausführen können, die Ihre Sprache nicht unterstützt.

In Ihrem Fall bedeutet das Hinzufügen einer neuen Version also, dass die aktuelle VM Ihren Code wahrscheinlich nicht ausführen will. Und selbst wenn sie es tut, enthält sie wahrscheinlich nicht die von Ihnen erwähnte Funktionalität, wenn diese Funktionalität nur in Version 51.0 enthalten ist, die Ihr aktueller Compiler/VM nicht unterstützt.

Ich meine, vielleicht ist das, was du versuchst zu tun, völlig normal, und es ist einfach so, dass ich mich damit nicht auskenne und meine Unwissenheit in diesem Bereich zeige :) aber ich glaube, da fehlt etwas.

0voto

DeezCashews Punkte 2152

Am einfachsten wäre es wohl, einen Java-Decompiler zu verwenden (siehe JADClipse für ein Eclipse-Plugin) und kompilieren Sie dann den Quellcode in die von Ihnen benötigte Version um.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X