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

yos*_*ssi 69 java exception

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

我得到的例外是:

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;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用apache tomcat 5.5.12和JAVA 1.6

s_t*_*v_e 99

当访问同一包中但位于不同jar和类加载器中的类的包范围方法时,会发生这种情况.

是我的来源,但现在链接已被破坏.以下是谷歌缓存的全文:

包(在包访问中)的范围是每个ClassLoader的范围.

您声明父ClassLoader加载接口,子ClassLoader加载实现.由于包范围的特定于ClassLoader的特性,这将不起作用.该接口对于实现类是不可见的,因为即使它是相同的包名,它们也在不同的ClassLoader中.

我只浏览了这个帖子中的帖子,但我想你已经发现如果你声明接口是公共的,这将会有用.通过相同的ClassLoader加载接口和实现也是有效的.

实际上,如果您希望任意人员实现接口(如果实现由不同的ClassLoader加载,您显然会这样做),那么您应该将接口公之于众.

包范围的ClassLoader-scoping(适用于访问包方法,变量等)类似于类名的一般ClassLoader-scoping.例如,如果我在单独的ClassLoader中定义它们,我可以定义两个名为com.foo.Bar的类,它们具有完全不同的实现代码.

乔尔

  • 你刚救了我很多时间和神经.非常好! (2认同)

And*_*yle 73

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

作为IllegalAccessError国家的javadocs ,

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

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

  • @yossi:你是怎么解决的?重新编译soruce并将其放入类路径?只是好奇你是否反编译了原来的课程并且考虑了它的内容. (3认同)