【问题标题】:java.lang.IllegalAccessError: tried to access methodjava.lang.IllegalAccessError:试图访问方法
【发布时间】:2011-10-27 22:21:59
【问题描述】:

我遇到了异常,但找不到原因。

我得到的例外是:

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

【问题讨论】:

    标签: java exception


    【解决方案1】:

    几乎可以肯定,您在运行时使用的类版本与您期望的版本不同。特别是,运行时类与您编译时所针对的类不同(否则这会导致编译时错误) - 该方法 曾经 是否为 private?您的系统上是否有旧版本的类/jar?

    作为IllegalAccessError 状态的javadocs,

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

    我肯定会查看您的类路径并检查它是否有任何惊喜。

    【讨论】:

    • @yossi:那你是怎么解决的?重新编译源并将其放入您的类路径中?只是好奇你是否反编译了原始类并看到了其中的内容。
    • 当我有这个时,我已经用一个公开的私有函数保存了文件,所以编辑器在 .jsp 文件中看到一切正常,但我没有重新启动主程序,所以它并没有真正编译新版本。
    • 我从刚安装的 maven 包中收到此错误。我已经更新了项目并清理了它,但似乎一切都发生了变化..
    【解决方案2】:

    如果getData 受到保护,请尝试将其公开。该问题可能存在于 JAVA 1.6 中,而在 1.5x 中不存在

    我为你的问题得到了这个。 Illegal access error

    【讨论】:

      【解决方案3】:

      当访问同一个包中但在不同 jar 和类加载器中的类的包作用域方法时会发生这种情况。

      This 是我的来源,但链接现在已断开。以下是来自谷歌缓存的全文:

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

      您声明父类加载器加载接口和子类 ClassLoader 加载实现。这不起作用,因为 包作用域的类加载器特定性质。界面不可见 实现类,因为即使它是相同的包名, 它们在不同的 ClassLoader 中。

      我只浏览了这个帖子中的帖子,但我想你已经发现了 如果您将接口声明为公共,这将起作用。它也会 努力让同一个 ClassLoader 加载接口和实现。

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

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

      乔尔

      【讨论】:

      • 我在带有 Struts 1.1 的 JBoss EAP 5.3 下的 commons-collections-3.2.1.jar 上遇到了这个问题,因为这个 JAR 已经在 J​​Boss 库中,但也打包在我的应用程序中。我从解决问题的应用程序中删除了 JAR。
      • 你为我节省了很多时间和精力。非常好!
      • 我为一个现在需要第二个参数的公共静态方法收到此错误。旧的 jar 文件在我替换后不再存在。有什么想法吗?
      • 我在同一个包中有一个带有包私有修饰符的抽象类和另一个带有公共修饰符的类(扩展前者)。两者都放在一个简单的罐子里。我正在使用来自网络应用程序的抽象类的方法。奇怪的是,我能够从 Eclipse 中将我的应用程序部署在 Tomcat 中,但不能在远程机器上的 Tomcat 上部署。我将抽象类的访问修饰符更改为 public,一切正常。
      • 我将 Firefox 驱动程序从 2.53.0 降级到 2.44.0 有帮助(我使用的是旧版本 Grails 2.3.11)。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        从 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);
        

        此处 Notification.Action 在 API 20 之前不可用,而我的最低版本是 API 16

        【讨论】:

          【解决方案6】:

          只是对已解决答案的补充:

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


          TL:DR;

          这不一定是代码问题,只是 Instant Run 问题

          【讨论】:

            【解决方案7】:

            我在 @RestController ApplicationInfoResource 有一个嵌套类 ApplicationInfo 的 Spring Boot 应用程序上遇到此错误。

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

            我遇到的异常

            2017-05-01 17:47:39.588 警告 1516 --- [nio-8080-exec-9] .m.m.a.ExceptionHandlerExceptionResolver : 已解决的异常导致 通过 Handler 执行: org.springframework.web.util.NestedServletException:处理程序调度 失败的;嵌套异常是 java.lang.IllegalAccessError: 试图 从类访问类 com.gt.web.rest.ApplicationInfo com.gt.web.rest.ApplicationInfoResource$$EnhancerBySpringCGLIB$$59ce500c

            解决方案

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

            【讨论】:

            • 您还应该考虑从您的类路径中删除 Spring Boot 的开发工具 - 可能只是暂时的。就我而言,IllegalAccessError 根本不合理。但是,当我删除了对 Dev Tools 的 Maven 依赖项并在不久之后再次添加它时,一切正常。
            • 非常感谢!你拯救了这一天。
            【解决方案8】:

            在我的情况下,问题是在某些接口A 中将方法定义为default,而其子类将其覆盖为私有。然后当方法被调用时,java Runtime 意识到它正在调用一个私有方法。

            我仍然对为什么编译器没有抱怨私有覆盖感到困惑..

            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();
            }
            

            【讨论】:

              【解决方案9】:

              在我的情况下,使用从 Eclipse 部署的 .ear 在 Wildfly 中运行我的应用程序时遇到此错误。因为它是从 eclipse 部署的,所以部署文件夹不包含 .ear 文件,而是一个代表它的文件夹,其中包含所有本来应该包含在 .ear 文件中的 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();
                }
              }
              

              【讨论】:

                【解决方案10】:

                由于 intellij 中的配置问题,我遇到了同样的错误。 如屏幕截图所示。 主模块和测试模块分别指向两个不同的 JDK。 (在intellij项目上按F12打开模块设置)

                我所有的 dto 都在使用 @lombok.Builder,我将其更改为 @Data。

                【讨论】:

                  【解决方案11】:

                  我遇到了类似的异常,但在班级级别

                  例如原因:java.lang.IllegalAccessError: 试图访问类 ....

                  我通过公开我的课程来解决这个问题。

                  【讨论】:

                    猜你喜欢
                    • 2016-05-31
                    • 2020-12-30
                    • 1970-01-01
                    • 2014-07-20
                    • 2013-02-02
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-12-22
                    相关资源
                    最近更新 更多