ASM BasicInterpreter IllegalStateException
Saya melihat pertanyaan ini di sini di SO dan saya mencoba untuk mengumpulkan kode dari jawaban yang diterima. Sayangnya, saya terus mendapatkan IllegalStateException di bagian Kode ini:
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;
}
};
Dengan jejak tumpukan:
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)
Pengecualian dimunculkan di sini di kelas BasicInterpreter :
public BasicInterpreter() {
super(/* latest api = */ ASM8);
if (getClass() != BasicInterpreter.class) {
throw new IllegalStateException(); // at this line
}
}
Saya mencoba mewarisi BasicInterpreter tetapi saya tetap mendapatkan pengecualian yang sama.
class BasicInterpreterLocal extends BasicInterpreter{} // Throws an IllegalStateException
Saya mencobanya dengan asm 7. *, 8. **, 9.0, tetapi tidak ada yang berhasil.
Jadi apa masalahnya?. Saya tidak bisa menemukannya.
Jawaban
Seperti yang dijelaskan dalam jawaban ini , subclass harus menggunakan konstruktor yang menerima nomor versi pustaka, untuk menentukan tingkat kompatibilitas pustaka ASM. Tampaknya, pustaka ASM versi 5, yang awalnya digunakan kode tersebut, tidak memeriksa persyaratan ini. Tetapi Anda menggunakan versi yang lebih baru (8, tampaknya) dari pustaka yang memberlakukan aturan ini.
Ubah kode menjadi
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;
}
};
untuk memperbaikinya. Saya juga akan memperbarui jawaban lainnya.