如何在同一个包中但在不同的 jar 中访问父 class 的包本地字段?

How can I access package-local fields of parent class in the same package but in different jar?

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

package android.content;

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

但是 CursorLoader 的这些 "package-local" 字段对于 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 平台进行更改。您在 IDE 中看到的 Android 平台组件的源代码是为了方便您了解平台,而不是访问其非 public API。

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

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