java.lang.IllegalAccessError:尝试访问方法
我遇到了一个例外,我找不到它的原因 我得到的例外是: java.lang.IllegalAccessError:尝试访问方法Connected.getData(Ljava/lang/String;)Ljava/sql/ResultSet;B班 该方法是公开的java.lang.IllegalAccessError:尝试访问方法,java,exception,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
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;
}
我正在使用ApacheTomcat 5.5.12
而JAVA 1.6几乎可以肯定,您在运行时使用的类版本与预期的版本不同。特别是,运行时类与您编译时使用的类不同(否则会导致编译时错误)——该方法是否为私有的?您的系统中是否有旧版本的类/JAR 作为
IllegalAccessError
状态的javadocs
通常,编译器会捕获此错误;只有在类的定义发生不兼容的更改时,才会在运行时发生此错误
我肯定会查看您的类路径,并检查它是否包含任何惊喜。如果
getData
受到保护,请尝试将其公开。这个问题可能存在于Java1.6中,而在1.5x中则不存在
我用这个来解决你的问题 当访问同一个包中但位于不同jar和类加载器中的类的包作用域方法时,会发生这种情况 是我的消息来源,但现在链接断了。以下是谷歌缓存的全文: 包(如在包访问中)的作用域为每个类加载器 您声明父类加载器加载接口和子类 类加载器加载实现。这不起作用,因为 包作用域的类加载器特定性质。界面对用户不可见 实现类,因为即使它是相同的包名, 它们在不同的类装入器中 我只是浏览了这篇帖子,但我想你已经发现了 如果您将接口声明为公共接口,那么这将起作用。它也会 让接口和实现都由同一个类加载器加载 真的,如果你期望任意的人来实现你想要的接口 如果实现是由不同的 类加载器),然后您应该将接口公开 包作用域的ClassLoader作用域(适用于访问包 方法、变量等)类似于 类名。例如,我可以定义两个类,都名为com.foo.Bar, 如果我单独定义它们,则使用完全不同的实现代码 类装入器 乔尔
当我在一个jar中有一个类试图从另一个jar访问一个类中的私有方法时,我就遇到了这种情况。我只是简单地将私有方法更改为public,重新编译并部署,之后它就正常工作了。从Android的角度来看: 方法在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);
此处通知。在API 20之前,操作不可用,我的最小版本是API 16只是对已解决答案的补充: 这可能是Android Studio的即时运行功能的一个问题,例如,如果您意识到在打开另一个活动后忘记将代码行添加到您的活动中:
finish()
,并且您已经重新打开了不应该重新打开的活动(此问题由finish()
解决),然后添加finish()
并立即运行,然后应用程序将因逻辑中断而崩溃
TL:DR强>
这不一定是代码问题,只是一个即时运行问题我在一个Spring启动应用程序上遇到了这个错误,其中一个
@RestController ApplicationInfo资源
有一个嵌套类ApplicationInfo
似乎Spring引导开发工具使用了不同的类装入器
我得到的例外情况
2017-05-01 17:47:39.588警告1516---[nio-8080-exec-9]
.m.m.a.ExceptionHandlerExceptionResolver:已解决导致的异常
通过处理程序执行:
org.springframework.web.util.NestedServletException:处理程序调度
失败;嵌套异常为java.lang.IllegalAccessError:已尝试
从类访问class com.gt.web.rest.ApplicationInfo
com.gt.web.rest.ApplicationInfoResource$$EnhancerBySpringCGLIB$$59ce500c
解决方案
我将嵌套类ApplicationInfo
移动到一个单独的.java文件中,并解决了这个问题。在我的例子中,问题是在某个接口a
中将方法定义为default
,而其子类将其重写为private。然后,当调用该方法时,java运行时意识到它正在调用一个私有方法
我仍然不明白为什么编译器没有抱怨私有重写
public interface A {
default void doStuff() {
// doing stuff
}
}
public class B {
private void doStuff() {
// do other stuff instead
}
}
public static final main(String... args) {
A someB = new B();
someB.doStuff();
}
在我的例子中,我在从eclipse部署的.ear中运行我的应用程序时遇到了这个错误。因为它是从eclipse部署的,所以部署文件夹不包含.ear文件,而是包含一个表示它的文件夹,其中包含了.ear文件中包含的所有JAR;就像耳朵被拉开一样
所以我在jar上加入了:
class MySuperClass {
protected void mySuperMethod {}
}
在另一个罐子里:
class MyExtendingClass extends MySuperClass {
class MyChildrenClass {
public void doSomething{
mySuperMethod();
}
}
}
解决方案是向MyExtendingClass添加一个新方法:
class MyExtendingClass extends MySuperClass {
class MyChildrenClass {
public void doSomething{
mySuperMethod();
}
}
@Override
protected void mySuperMethod() {
super.mySuperMethod();
}
}
由于intellij中的配置问题,我遇到了相同的错误。
如截图所示。
主模块和测试模块指向两个不同的JDK。(在intellij项目上按F12打开模块设置)
此外,我所有的dto都使用@lombok.Builder,我将其改为@Data
我遇到了类似的异常,但是在班级级别
e、 g.原因:java.lang.IllegalAccessError:试图访问类
我做了我的clas来解决这个问题