Beispiel aus dem wirklichen Leben:
public class Control {
public static final long EXPIRED_ON = 1386082988202l;
public static final boolean isExpired() {
return (System.currentTimeMillis() > EXPIRED_ON);
}
}
In anderen Klassen kann ich dann beenden, wenn der Code abgelaufen ist. Wenn ich auf die Variable EXPIRED_ON aus einer anderen Klasse verweise, ist die Konstante inline zum Bytecode, was es sehr schwierig macht, alle Stellen im Code zu finden, die das Ablaufdatum überprüfen. Wenn die anderen Klassen jedoch die Methode isExpired () aufrufen, wird die eigentliche Methode aufgerufen. Dies bedeutet, dass ein Hacker die Methode isExpired durch eine andere ersetzen kann, die immer false zurückgibt.
Ich bin damit einverstanden, dass es sehr schön wäre, einen Compiler zu zwingen, die statische endgültige Methode allen Klassen zuzuordnen, die darauf verweisen. In diesem Fall müssen Sie nicht einmal die Control-Klasse einschließen, da sie zur Laufzeit nicht benötigt wird.
Nach meinen Recherchen ist dies nicht möglich. Möglicherweise können einige Obfuscator-Tools dies tun, oder Sie können Ihren Erstellungsprozess ändern, um Quellen vor dem Kompilieren zu bearbeiten.
Versuchen Sie, die andere Klasse ohne die Control-Klasse im Klassenpfad auszuführen, um zu beweisen, ob die Methode aus der Steuerungsklasse während der Kompilierung inline zu einer anderen Klasse gestellt wird.