Я пытаюсь использовать отражение для доступа к закрытому финальному полю из класса 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) { }
}
Это именно то, что мне нужно,Но так как это абстрактный класс, я не могу его создать.И я также не могу расширить его, потому что он скрыт.
Есть идеи, как получить доступ к этому приватному полю или как расширить скрытый абстрактный класс с помощью отражения?