ist es möglich, zu deaktivieren javac ist inlining von static-final-Variablen?

Java statische compiler (javac) inlines einige static final-Variablen und bringt die Werte direkt in den Konstanten-pool. Betrachten Sie das folgende Beispiel. Klasse A definiert einige Konstanten (public static final-Variablen):

public class A {
    public static final int INT_VALUE = 1000;
    public static final String STRING_VALUE = "foo";
}

Klasse B verwendet diese Konstanten:

public class B {
    public static void main(String[] args) {
        int i = A.INT_VALUE;
        System.out.println(i);
        String s = A.STRING_VALUE;
        System.out.println(s);
    }
}

Beim kompilieren der Klasse B, javac bekommt die Werte dieser Konstanten aus der Klasse A und inlines diese Werte in B.class. Als Ergebnis, die Abhängigkeit B hatte die Klasse zur compile-Zeit werden gelöscht, aus dem bytecode. Dies ist ein eher eigenartiges Verhalten, weil Sie das Backen in der die Werte dieser Konstanten zu der Zeit der Zusammenstellung. Und Sie würden denken, dass dies ist eine der einfachsten Dinge, die der JIT-compiler zur Laufzeit.

Gibt es eine Möglichkeit oder irgendwelche versteckten compiler-option, mit der Sie diese Funktion deaktivieren inlining Verhalten von javac? Für den hintergrund, wir suchen zu tun bytecode-Analyse für die Abhängigkeit Zwecke, und es ist einer der wenigen Fälle, wo der bytecode-Analyse schlägt fehl, zu erkennen, compile-time Abhängigkeiten. Danke!

Bearbeiten: dies ist eine leidige Angelegenheit, weil wir in der Regel nicht alle Steuern auf die Quelle (z.B. third-party Bibliotheken, die Definition von Konstanten). Wir sind daran interessiert, die Erkennung dieser Abhängigkeiten, die aus der Perspektive der mit der Konstanten. Da die Referenz wird gelöscht, der code, der verwendet die Konstanten, es gibt keinen einfachen Weg, um Sie zu erkennen, kurz, tun, source-code-Analyse.

  • Gute Frage!!! Irgendwann in dieser inlining von Konstanten verursachen seltsame Probleme... Aber ich habe nicht gesehen, eine richtige Art und Weise zu beschränken.
InformationsquelleAutor sjlee | 2010-08-19
Schreibe einen Kommentar