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

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

我得到的例外是:

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 ? 你的系统上有没有老版本的类/jar子?

作为IllegalAccessError状态的javadoc,

通常,这个错误是由编译器捕获的; 这个错误只能在运行时发生,如果一个类的定义不兼容改变。

我肯定会看你的类path,并检查是否有任何意外。

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

这是我的来源,但链接现在被打破。 以下是谷歌caching的全文:

软件包(如软件包访问权限)的范围是每个ClassLoader。

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

我只是在这个线程中删除了post,但是我认为你已经发现,如果你声明这个接口是公开的,这将会起作用。 也可以使用同一个ClassLoader加载接口和实现。

真的,如果你期望任意的人来实现接口(如果实现被不同的ClassLoader加载,你显然会这样做),那么你应该公开这个接口。

包范围的ClassLoader范围(适用于访问包方法,variables等)与类名称的一般ClassLoader范围类似。 例如,我可以定义两个名为com.foo.Bar的类,如果我将它们定义在不同的ClassLoaders中,它们将会有完全不同的实现代码。

乔尔

如果getData被保护,然后尝试公开。 这个问题可能在JAVA 1.6中存在,在1.5x中不存在

我为你的问题得到了这个。 非法访问错误

我在Spring启动应用程序中得到这个错误,其中一个@RestController ApplicationInfoResource有一个嵌套的类ApplicationInfo

Spring Boot Dev Tools似乎使用了不同的类加载器。

我得到的例外

2017-05-01 17:47:39.588 WARN 1516 — [nio-8080-exec-9] .mmaExceptionHandlerExceptionResolver:Handler执行引起的exceptionexception:org.springframework.web.util.NestedServletException:Handler dispatch failed; 嵌套的exception是java.lang.IllegalAccessError:尝试访问类com.gt.web.rest.ApplicationInfoResource中的类com.gt.web.rest.ApplicationInfo $$ EnhancerBySpringCGLIB $$ 59ce500c

我将嵌套的类ApplicationInfo移动到一个单独的.java文件并摆脱了这个问题。

这发生在我身上,当我在一个jar中的一个类试图从另一个jar中访问一个类的私有方法。 我只是将私有方法更改为public,重新编译和部署,之后就可以正常工作。

从Android的angular度来看: 方法在api版本中不可用

我得到这个问题,主要是因为我正在使用该Android版本中不可用/弃用的一些东西

错误的方法:

 Notification.Builder nBuilder = new Notification.Builder(mContext); nBuilder.addAction(new Notification.Action(android.R.drawable.ic_menu_view,"PAUSE",pendingIntent)); 

正确的方法:

 Notification.Builder nBuilder = new Notification.Builder(mContext); nBuilder.addAction(android.R.drawable.ic_media_pause,"PAUSE",pendingIntent); 

这里Notification.Action在API 20之前是不可用的,我的最小版本是API 16

只是除了解决的答案:

这可能是Android Studio的即时运行function的一个问题,例如,如果您意识到忘记在打开另一个代码后忘记添加代码行: finish()到您的活动中,并且您已经重新打开了您不应该执行的活动已经重新打开( finish()解决了),然后添加finish()和即时运行发生,然后应用程序将崩溃,因为逻辑已被打破。


TL:DR;

这不一定是代码问题,只是即时运行问题