Я подключаюсь к методу через Xposed framework for Android. Это эффективно позволяет мне вводить свой собственный код в другое приложение для Android во время выполнения и запускать его так, как если бы целевое приложение было построено с ним. Забавные вещи. Хотя это как Я вставляю код, мой вопрос должен быть независимым от Xposed, поскольку он использует расширение стандартных утилитов отражения Java, чтобы получить нужные мне ссылки на классы.Синхронизация по объекту, полученному с помощью отражения
Class targetClass = XposedHelpers.findClass("fullClassName", targetAppClassLoader);
Object timerField = XposedHelpers.getStaticObjectField(targetClass, "targetFieldName");
// This /should/ synchronize with the actual static field not our local representation of it
synchronized (timerField) {
// Do stuff
}
В приведенном выше фрагменте я извлекаю статическое поле объекта в классе через отражение. Внутри целевое приложение использует synchronized
блоков в этом поле. Мне нужно работать аналогичным синхронно, поэтому я делаю то же самое в своем собственном коде (link to full code).
С Java objects are sorta passed by reference Мне нужно получить локальную ссылку на статический объект в целевом приложении. Но чем Java synchronized
блокирует работу над отраженными объектами? И работают ли они вместе с необработанными ранее существующими блоками synchronized
?
Для справки, вот код для findClass
и getStaticObjectField
. Первый по сути возвращает a Class<?>
с org.external.org.apache.commons.lang3.ClassUtils
, а последний (по существу) вызывает getDeclaredField
по параметру Class<?>
, устанавливает Field
в доступный и возвращает результат get(null)
на Field
.
Полезно знать. Он определенно потерпит неудачу на> = 5.0, поскольку Xposed в настоящее время является Dalvik-специфичным. Мне любопытно, что, какие части вы находите «симпатичными»? –
Я просто получил удовольствие от чтения. Я бы не подумал об этом. Все еще не уверен, почему я хочу ... Тем не менее, определенно умный. –
Gotcha! Это здорово, когда у вас нет возможности запуска пользовательских Android-ROM или расширения возможностей приложений с закрытым исходным кодом. –