【问题标题】:How can I access package-local fields of parent class in the same package but in different jar?如何访问同一个包但在不同 jar 中的父类的包本地字段?
【发布时间】:2016-03-13 07:11:18
【问题描述】:

我正在尝试覆盖CursorLoaderpublic Cursor loadInBackground() 方法,所以我在我的应用程序中尝试了:

package android.content;

public class DistinctCursorLoader extends CursorLoader {
    @Override
    public Cursor loadInBackground() {
        // I need to use mUri, mProjection, mSelection, mSortOrder

但是 CursorLoader 的这些“本地包”字段对 DistinctCursorLoader 是不可见的——即使它们在同一个包中(尽管显然不在同一个 jar 中)

这是来自 CursorLoader.java(android 的源代码):

package android.content;

public class CursorLoader extends AsyncTaskLoader<Cursor> {
    Uri mUri;
    String[] mProjection;
    String mSelection;
    String[] mSelectionArgs;
    String mSortOrder;

【问题讨论】:

  • 它们是由不同的类加载器加载的吗?
  • 我没有做任何事情来以不同的方式加载它们,但我不知道它在 android 中是如何工作的。然而值得注意的是,即使在 AndroidStudio 中它已经抱怨这些字段,这也不是运行时问题。

标签: java android access-control


【解决方案1】:

您不能简单地通过将自己置于其命名空间中来更改 Android 平台。您在 IDE 中看到的 Android 平台组件的源代码是为了方便您了解平台,而不是访问其非公共 API。

android.* 中的所有类在运行时都存在于设备本身上。它们没有捆绑到应用程序中。因此,首先,您不能保证这些特定字段会存在,因为 Android 版本之间可能会发生变化。其次,这些字段可能在发送到设备之前已被重命名或混淆,因为它们不是公共 API,并且不希望被应用代码直接访问。

如果你觉得很叛逆,你可以尝试在运行时使用反射来查找和更改隐藏的 API,但这肯定会在未来给你带来麻烦。所以不要那样做。

【讨论】:

  • 那么这个“包本地”访问权限在java中是如何工作的呢?根据我看到的文件,它应该让“相同”包中的其他类看到它们。好像他们没有看到。我猜是因为它们在不同的罐子里。
  • 这不是哪个罐子的问题。这是在编译时完全不可用的问题,因为符号重要的唯一时间是在设备上运行时。鉴于运行某种形式的 Android 的设备不少于 10,000 台,您如何确定您正在寻找的非公开/受保护的字段是否存在您所期望的名称和类型?你不能。你不应该这样做。
猜你喜欢
  • 2014-12-23
  • 2011-08-23
  • 2014-04-21
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多