java.lang.IllegalAccessError:尝试访问方法

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (42)

我得到一个例外,我找不到它的原因。

我得到的例外是:

java.lang.IllegalAccessError:试图访问方法Connected.getData(Ljava / lang / String;)Ljava / sql / ResultSet; 来自B类

该方法是公开的。

public class B
{
  public void myMethod()
  {
   Connected conn = new Connected();  // create a connected class in order to connect to The DB 
   ResultSet rs = null;  // create a result set to get the query result
   rs = conn.getData(sql); // do sql query
  }
}

public class Connected 
{
 public ResultSet getData(String sql) 
{
  ResultSet rs = null;
  try 
  {
     prepareConnection();
     stmt = conn.createStatement();
     stmt.execute(sql);
     rs = stmt.getResultSet();
  }
  catch (SQLException E) 
      {
    System.out.println("Content.getData Error");
    E.printStackTrace();
       }
return rs;
}

我使用的是Apache Tomcat 5.5.12和JAVA 1.6

提问于
用户回答回答于

您几乎可以肯定地在运行时使用不同版本的类到您期望的类。尤其是运行时类将是你编译反对(否则这会导致编译时错误)的一个不同-有法private?你的系统上的任何地方都有老版本的类/罐子吗?

作为IllegalAccessError国家的javadocs ,

通常,这个错误被编译器捕获; 如果某个类的定义发生了不兼容的更改,则只能在运行时发生此错误。

我一定会看看你的类路径,并检查它是否有任何意外。

用户回答回答于

访问位于同一个包但位于不同jar和classloader中的类的包范围方法时会发生这种情况。

是我的来源,但现在这个链接被破坏了。以下是谷歌缓存的全文:

包(如包访问中)的范围是每个ClassLoader。 您声明父ClassLoader加载接口,并且子ClassLoader加载实现。由于程序包范围的ClassLoader特有性质,这将不起作用。该接口对实现类不可见,因为即使它们具有相同的包名称,它们也位于不同的ClassLoader中。 我只是在这个线程中剔除了帖子,但我认为你已经发现,如果你声明该接口是公开的,这将起作用。它也可以用同一个ClassLoader加载接口和实现。 真的,如果你期望任意人员实现接口(如果实现由不同的ClassLoader加载,你显然会这样做),那么你应该公开接口。 包范围的ClassLoader范围(适用于访问包方法,变量等)与类名称的一般ClassLoader范围类似。例如,如果我在不同的ClassLoaders中定义它们,我可以定义两个名为com.foo.Bar的类,它们具有完全不同的实现代码。 乔尔

扫码关注云+社区