安卓:当尝试使用自定义“Application”类时,出现java.lang.IllegalAccessException。

42

我试着创建一个自定义的Application类,步骤如下:

  1. 创建一个继承Application类的空子类,名为MyApp
  2. 在manifest中,指定我的应用程序的android::name: <application android:name=".MyApp" ...

然而,当我尝试运行我的应用程序时,我遇到了以下错误: java.lang.RuntimeException: Unable to instantiate application com.test.MyApp java.lang.IllegalAccessException: access to class not allowed

2个回答

123

请确保您的自定义类是 public 的,具有一个 public 无参构造函数,并且构造函数链接到超类的构造函数。


4
我曾遇到类似的异常情况,当时我想启动一个服务。事实证明,服务类是无意中被设成了包私有(package-private),因此您的解决方案帮助我找到了问题,谢谢! - JonnyBoy
@CommonsWare 不是真正的构造函数,因为我们(开发人员)不会实例化框架组件。而是一个 onCreate() 方法。 - Michał Dobi Dobrzański
@MichałDobiDobrzański: “无法实例化”组件的可能原因之一是该类没有“公共”的零参数构造函数。默认情况下,如果没有其他构造函数,一个类将会有一个。但是,如果您定义了任何构造函数,您将失去默认的“公共”零参数构造函数。我同意,大多数情况下,您不需要在“应用程序”子类上使用自定义构造函数,但这并不妨碍您定义一个。我试图解答11年前提出的问题所涉及的问题。如果我的回答表达得不好,我很抱歉! - CommonsWare

1

我同意CommonsWare的观点。如果您扩展android.app.Application来为项目定义自定义应用程序,请确保将您的类标记为public,并且也要有public no-agrs构造函数。

然而,在android.app.Application API上提到,通常没有必要子类化Application。在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。

希望这能帮到您。

干杯。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接