Использование отражения для получения приватных полей из скрытого класса AOSP - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь использовать отражение для доступа к закрытому финальному полю из класса ActivityView, который скрыт в Android AOSP.Я создал объект ActivityView, используя отражение, которое имеет SurfaceView внутри, и мне нужно иметь обратный вызов, который сообщает мне, когда поверхность создается.

val activityViewClass = Class.forName("android.app.ActivityView")
val activityView = activityViewClass.getConstructor(Context::class.java).newInstance(this)

Затем есть дваварианты доступа к этому обратному вызову:

1.Прямой доступ к закрытому окончательному полю обратного вызова из класса.

Поэтому я пытаюсь получить доступ к полю mSurfaceCallback , которое выбрасывает java.lang.NoSuchFieldException .

val field = activityView::class.java.getDeclaredField("mSurfaceCallback")

Если я пытаюсь получить доступ к любому другому закрытому полю, я получаю ту же ошибку.

Если я звоню activityView::class.java.declaredFields, я получаю пустой список.

Я пробовал в Java, в Котлине с kotlin-refle библиотекой и безуспешно.

Я также пробовал https://github.com/ronmamo/reflections библиотеку для отражения, я получаю те же результаты.

2.Установите ActivityView.StateCallback на представление деятельности.

ActivityView имеет объект StateCallback, который выглядит следующим образом:

/** 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) { } }

Это именно то, что мне нужно,Но так как это абстрактный класс, я не могу его создать.И я также не могу расширить его, потому что он скрыт.

Есть идеи, как получить доступ к этому приватному полю или как расширить скрытый абстрактный класс с помощью отражения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...