当前位置: 首页 > 知识库问答 >
问题:

使用反射从隐藏的AOSP类获取私有字段

贺经纶
2023-03-14
val activityViewClass = Class.forName("android.app.ActivityView")
val activityView = activityViewClass.getConstructor(Context::class.java).newInstance(this)

如果调用ActivityView::Class.java.DeclaredFields,将得到一个空列表。

我尝试在Java中,在Kotlin中使用kotlin-reflect库,但没有成功。

我还尝试了https://github.com/ronmamo/reflections库进行反射,我得到了同样的结果。

/** Callback that notifies when the container is ready or destroyed. */
    public abstract static class StateCallback {
        /**
         * Called when the container is ready for launching activities. Calling
         * {@link #startActivity(Intent)} prior to this callback will result in an
         * {@link IllegalStateException}.
         *
         * @see #startActivity(Intent)
         */
        public abstract void onActivityViewReady(ActivityView view);
        /**
         * Called when the container can no longer launch activities. Calling
         * {@link #startActivity(Intent)} after this callback will result in an
         * {@link IllegalStateException}.
         *
         * @see #startActivity(Intent)
         */
        public abstract void onActivityViewDestroyed(ActivityView view);
        /**
         * Called when a task is moved to the front of the stack inside the container.
         * This is a filtered version of {@link TaskStackListener}
         */
        public void onTaskMovedToFront(ActivityManager.StackInfo stackInfo) { }
    }

你知道如何访问那个私有字段或者如何使用反射扩展一个隐藏的抽象类吗?

共有1个答案

吴俊风
2023-03-14

系统应用程序无需做任何事情就可以访问隐藏类。如果可以访问ActivityView,还可以访问StateCallback。

您应该定义状态

private StateCallback mStateCallback = new StateCallback() {
            @Override
            public void onActivityViewReady(ActivityView view) {
                Log.v(LOG_TAG, "onActivityViewReady");
            }

            @Override
            public void onActivityViewDestroyed(ActivityView view) {
                Log.v(LOG_TAG, "onActivityViewDestroyed");
            }

            @Override
            public void onTaskMovedToFront(ActivityManager.StackInfo stackInfo) {
                Log.v(LOG_TAG, "onTaskMovedToFront");
            }
        };

然后这样设置

    mActivityView = findViewById(R.id.activity_view);
    mActivityView.setCallback(mStateCallback);
 类似资料:
  • 问题内容: 我想知道是否有一种方法可以获取java中某个类的所有私有字段及其类型。 例如,假设我有一堂课 现在,我想获得的所有私有字段(,,类)(如果不知道所有领域前期的名称),并检查它们的类型。 问题答案: 有可能获得与方法的所有字段的。然后,您必须检查每个字段的修饰符以查找私有字段: 请注意,这不会返回继承的字段。 最终,您可以使用Field.getType()方法获得字段的类型。

  • 现在,我想获取类的所有私有字段(、、)(事先不知道所有字段的名称)并检查它们的类型。

  • 基本上,我的要求是通过使用反射来获取超类对象,以便获得字段名及其值。 所以,我有一门课 现在我正在使用 当我尝试使用以下代码访问该字段时,它会给我java.lang.Class类的类型。 它让我异常 有人能帮助我如何将其转换为对象,以便我可以访问文件夹

  • 问题内容: 我无法获取字段值。我想做的是在运行时获取对象。请让我知道我要去哪里了。 测试类 } EX.class } 问题答案: 像这样 或者,您可以使用类的方法在运行时获取对象的实例。您仍然需要首先设置该实例变量,否则它将没有任何值。 例如 或者,在其构造函数中有两个参数的地方,例如String和int … 或者您可以在运行时使用它为其构造函数查询 注意:我特意省略了将在此创建的对象强制转换为预

  • 现在,有没有可能通过反思来实现这一点呢?

  • 下面是我的示例类,我希望通过在这行中使用反射来获取y和z字段(Field[]fields=forName.getDeclaredFields();)我得到了空数组。如果y和z不是类结构的一部分,那么它们属于哪一部分