ASM BasicInterpreter IllegalStateException
Ich habe diese Frage hier auf SO gesehen und versuche, den Code aus der akzeptierten Antwort zu kompilieren. Leider erhalte ich in diesem Teil des Codes immer wieder eine IllegalStateException:
BasicInterpreter basic = new BasicInterpreter() {
@Override public BasicValue newValue(Type type) {
return type!=null && (type.getSort()==Type.OBJECT || type.getSort()==Type.ARRAY)?
new BasicValue(type): super.newValue(type);
}
@Override public BasicValue merge(BasicValue a, BasicValue b) {
if(a.equals(b)) return a;
if(a.isReference() && b.isReference())
// this is the place to consider the actual type hierarchy if you want
return BasicValue.REFERENCE_VALUE;
return BasicValue.UNINITIALIZED_VALUE;
}
};
Mit der Stapelverfolgung:
Exception in thread "main" java.lang.IllegalStateException
at org.objectweb.asm.tree.analysis.BasicInterpreter.<init>(BasicInterpreter.java:66)
at ConstantTracker$1.<init>(ConstantTracker.java:48)
at ConstantTracker.<init>(ConstantTracker.java:48)
at HelloWorld.analyze(HelloWorld.java:37)
at HelloWorld.main(HelloWorld.java:28)
Die Ausnahme wird hier in der BasicInterpreter- Klasse ausgelöst :
public BasicInterpreter() {
super(/* latest api = */ ASM8);
if (getClass() != BasicInterpreter.class) {
throw new IllegalStateException(); // at this line
}
}
Ich habe versucht, den BasicInterpreter zu erben, erhalte aber immer wieder die gleiche Ausnahme.
class BasicInterpreterLocal extends BasicInterpreter{} // Throws an IllegalStateException
Ich habe es mit asm 7. *, 8. **, 9.0 versucht, aber nichts funktioniert.
Also, wo liegt das Problem?. Ich konnte es nicht finden.
Antworten
Wie in dieser Antwort erläutert , sollten Unterklassen den Konstruktor verwenden, der eine Bibliotheksversionsnummer akzeptiert, um die Kompatibilitätsstufe der ASM-Bibliothek zu bestimmen. Es scheint, dass Version 5 der ASM-Bibliothek, die der Code ursprünglich verwendete, diese Anforderung nicht überprüft hat. Sie verwenden jedoch eine neuere Version (anscheinend 8) der Bibliothek, die diese Regel erzwingt.
Ändern Sie den Code in
BasicInterpreter basic = new BasicInterpreter(Opcodes.ASM5) { // <- the crucial point
@Override public BasicValue newValue(Type type) {
return type!=null && (type.getSort()==Type.OBJECT || type.getSort()==Type.ARRAY)?
new BasicValue(type): super.newValue(type);
}
@Override public BasicValue merge(BasicValue a, BasicValue b) {
if(a.equals(b)) return a;
if(a.isReference() && b.isReference())
// this is the place to consider the actual type hierarchy if you want
return BasicValue.REFERENCE_VALUE;
return BasicValue.UNINITIALIZED_VALUE;
}
};
um dies zu beheben. Ich werde auch die andere Antwort aktualisieren.