我得到一个例外,我找不到它的原因.
我得到的例外是:
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的类,它们具有完全不同的实现代码.
乔尔
And*_*yle 73
您几乎可以肯定在运行时使用不同版本的类到您期望的类.尤其是运行时类将是你编译反对(否则这会导致编译时错误)的一个不同-有法过了private?您的系统上是否有旧版本的课程/罐子?
作为IllegalAccessError国家的javadocs ,
通常,编译器会捕获此错误; 如果类的定义发生了不兼容的更改,则此错误只能在运行时发生.
我肯定会看看你的类路径并检查它是否有任何意外.