解决IllegalAccessError问题

时间:2013-01-18 21:42:23

标签: java eclipse exception reflection

我有以下情况:

2个Eclipse项目位于同一工作区,Apa和Bepa(为简洁起见,使用假名)。

Project Apa引用(包括)项目Bepa。

我在Bepa中有一个X类,使用公共方法b()。 调用X.b()直接在项目Bepa中正常工作。

但是,在Apa中创建对X实例的引用,然后在此引用上调用b(),会产生以下结果:

Exception in thread "main" java.lang.IllegalAccessError: tried to access method java_cup.runtime.Symbol.<init>(II)V from class de.uni_freiburg.informatik.ultimate.smtinterpol.util.MySymbolFactory$LineColumnSymbol
at de.uni_freiburg.informatik.ultimate.smtinterpol.util.MySymbolFactory$LineColumnSymbol.<init>(MySymbolFactory.java:31)
at de.uni_freiburg.informatik.ultimate.smtinterpol.util.MySymbolFactory.startSymbol(MySymbolFactory.java:95)
at java_cup.runtime.LRParser.parse(LRParser.java:393)
at de.uni_freiburg.informatik.ultimate.smtinterpol.smtlib2.ParseEnvironment.parseStream(ParseEnvironment.java:152)
at de.uni_freiburg.informatik.ultimate.smtinterpol.smtlib2.ParseEnvironment.parseScript(ParseEnvironment.java:118)
at de.uni_freiburg.informatik.ultimate.smtinterpol.smtlib2.SMTLIB2Parser.run(SMTLIB2Parser.java:47)
at de.uni_freiburg.informatik.ultimate.smtinterpol.Main.main(Main.java:121)
at de.uka.ilkd.key.keynterpol.KeYnterpolInterface.main(KeYnterpolInterface.java:36)

根据我的理解,罪魁祸首是B引用的第三方jar。然而,我不能为我的生活弄清楚为什么我只能在Bepa内使用它,而不是Apa。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

IllegalAccessError是IncompatibleClassChangeError的子类。如果在执行代码时抛出IncompatibleClassChangeError,这通常表示您的代码没有运行与编译它相同的类。

在您的情况下,导致IllegalAccessError被抛出的方法是a constructor of the java_cup.runtime.Symbol class,它具有默认的可见性:

    Symbol(int sym_num, int state)
    {
        sym = sym_num;
        parse_state = state;
    }

调用此构造函数的代码位于不同的包中,因此无法直接调用此构造函数。通常,编译器会捕获此类错误,因为尝试从另一个包访问package-private成员会导致编译器错误。但是,在您的情况下,您似乎没有任何此类编译器错误。

如果您使用与其编译的相同类路径运行代码,那么我只能猜测java_cup.*类在类路径上出现多次,对于上面的构造函数具有不同的可见性。编译器必须找到Symbol类的一个副本,并且此构造函数是公共的,并且JVM必须找到具有此构造函数包的私有副本。