我有以下情况:
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。任何帮助将不胜感激。
答案 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必须找到具有此构造函数包的私有副本。