ASM BasicInterpreter IllegalStateException
Bu soruyu burada SO'da gördüm ve kabul edilen cevaptan kodu derlemeye çalışıyorum. Maalesef, Kodun bu bölümünde IllegalStateException alıyorum:
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;
}
};
Yığın izleme ile:
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)
Buradaki istisna, BasicInterpreter sınıfında ortaya çıkar:
public BasicInterpreter() {
super(/* latest api = */ ASM8);
if (getClass() != BasicInterpreter.class) {
throw new IllegalStateException(); // at this line
}
}
BasicInterpreter'ı devralmaya çalıştım ama aynı istisnayı almaya devam ediyorum.
class BasicInterpreterLocal extends BasicInterpreter{} // Throws an IllegalStateException
ASM 7. *, 8. **, 9.0 ile denedim ama hiçbir şey çalışmıyor.
Peki sorun nedir? Ben bulamadım.
Yanıtlar
Bu cevapta açıklandığı gibi , alt sınıflar ASM kitaplığının uyumluluk düzeyini belirlemek için kitaplık sürüm numarasını kabul eden kurucuyu kullanmalıdır. Görünüşe göre, kodun başlangıçta kullandığı ASM kitaplığının 5. sürümü bu gereksinimi kontrol etmedi. Ancak bu kuralı uygulayan kütüphanenin daha yeni bir sürümünü (görünüşe göre 8) kullanıyorsunuz.
Kodu şu şekilde değiştirin:
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;
}
};
bunu düzeltmek için. Diğer yanıtı da güncelleyeceğim.