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

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

我遇到了一个例外,我找不到它的原因

我得到的例外是:

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;
}
我正在使用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来解决这个问题