Java 解决IllegalAccessError问题

Java 解决IllegalAccessError问题,java,eclipse,exception,reflection,Java,Eclipse,Exception,Reflection,我有以下情况: 两个Eclipse项目位于同一个工作区中,分别是Apa和Bepa(为了简洁起见,使用假名) 项目Apa参考(包括)项目Bepa 我在Bepa中有一个类X,带有公共方法b()。 在项目Bepa中直接调用X.b()可以很好地工作 但是,在Apa中创建对X实例的引用,然后在此引用上调用b(),结果如下: Exception in thread "main" java.lang.IllegalAccessError: tried to access method java_cup.run

我有以下情况:

两个Eclipse项目位于同一个工作区中,分别是Apa和Bepa(为了简洁起见,使用假名)

项目Apa参考(包括)项目Bepa

我在Bepa中有一个类X,带有公共方法b()。 在项目Bepa中直接调用X.b()可以很好地工作

但是,在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)
线程“main”java.lang.IllegalAccessError中的异常:试图从de.uni_freiburg.informatik.ultimate.smtinterpol.util.MySymbolFactory$LineColumnSymbol类访问方法java_cup.runtime.Symbol.(II)V
位于de.uni_freiburg.informatik.ultimate.smtinterpol.util.MySymbolFactory$lineColumnSymble.(MySymbolFactory.java:31)
在de.uni_freiburg.informatik.ultimate.smtinterpol.util.MySymbolFactory.startSymbol(MySymbolFactory.java:95)
在java_cup.runtime.LRParser.parse(LRParser.java:393)
位于de.uni_freiburg.informatik.ultimate.smtinterpol.smtlib2.ParseEnvironment.parseStream(ParseEnvironment.java:152)
位于de.uni_freiburg.informatik.ultimate.smtinterpol.smtlib2.ParseEnvironment.parseScript(ParseEnvironment.java:118)
位于de.uni_freiburg.informatik.ultimate.smtinterpol.smtlib2.SMTLIB2Parser.run(SMTLIB2Parser.java:47)
位于de.uni_freiburg.informatik.ultimate.smtinterpol.Main.Main(Main.java:121)
位于de.uka.ilkd.key.keynterpol.KeYnterpolInterface.main(KeYnterpolInterface.java:36)

据我所知,罪魁祸首是B引用的第三方jar。然而,我一辈子都不明白为什么我只能从Bepa内部使用它,而不能从Apa内部使用它。非常感谢您的帮助。

IllegaAccessError是的子类。如果在代码执行时引发了不兼容的ClassChangeError,这通常表示代码运行时使用的类与编译时使用的类不同

在您的情况下,引发IllegaAccessError的方法是具有默认可见性的:

    Symbol(int sym_num, int state)
    {
        sym = sym_num;
        parse_state = state;
    }
调用此构造函数的代码位于不同的包中,因此不能直接调用此构造函数。通常情况下,编译器会捕获类似这样的错误,因为试图从另一个包访问包私有成员会导致编译器错误。然而,在您的情况下,您似乎没有任何这样的编译器错误


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

您是正常调用该方法还是使用反射?据我所知,通常是@millimoose。我没有做任何特别的事情。嗯,正常使用时不应该发生这种情况,除非您针对库的一个版本进行编译,并使用另一个版本运行,其中该方法的访问修饰符发生了更改。我会尝试清理和重建整个工作区,以确保某个时间戳已损坏的旧类文件不会四处游荡。@millimoose已经尝试过了,但没有帮助。考虑到这一点,我很确定这是安全经理在胡闹,但我从未见过它有这样的行为。我试着把项目B变成一个JAR,并正常地引用它,但同样的异常再次出现。由于应用程序的性质,关闭安全管理器不是一个选项,不幸的是:-/请包括整个stacktrace。太好了!非常感谢你,卢克,这真让我头疼。