微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ASM BasicInterpreter IllegalStateException

如何解决ASM BasicInterpreter IllegalStateException

我在SO上看到了这个question,我正在尝试从接受的答案中编译代码。 不幸的是,我在代码的这一部分不断收到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;
        }
    };

具有堆栈跟踪:

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)

BasicInterpreter类在此处引发了异常:

public BasicInterpreter() {
    super(/* latest api = */ ASM8);
    if (getClass() != BasicInterpreter.class) {
      throw new IllegalStateException(); // at this line
    }
  }

我试图继承BasicInterpreter,但我不断收到相同的异常。

class BasicInterpreterLocal extends BasicInterpreter{} // Throws an IllegalStateException

我用asm 7。*,8。**,9.0尝试了一下,但是没有用。

那是什么问题?我找不到。

解决方法

this answer中所述,子类应使用接受库版本号的构造函数来确定ASM库的兼容性级别。似乎代码最初使用的ASM库的版本5并未检查此要求。但是您正在使用强制执行此规则的库的较新版本(显然是8)。

将代码更改为

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;
    }
};

解决此问题。我还将更新其他答案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。