2014-12-30 2 views
0

Я подключаюсь к методу через 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.

ответ

1

Есть некоторые оговорки, но ответ «да». Объект - это объект, независимо от того, как вы получаете ссылку. Если вы синхронизируете ссылку, вы используете ту же блокировку, что и все остальные, которые синхронизируются по ссылке.

Главное, что вы должны быть уверены, что это ссылка на такой же объект. Я просто взглянул на код в Xposed (милый материал, кстати, скорее всего, не сработает> = 5,0), и я не вижу, чтобы объекты были упорядочены/немаршарированы, поэтому все выглядит хорошо. Если объект, на котором вы синхронизируете, например, Parcelable или Binder, выберете, потому что, вероятно, будет несколько копий «того же» объекта.

+0

Полезно знать. Он определенно потерпит неудачу на> = 5.0, поскольку Xposed в настоящее время является Dalvik-специфичным. Мне любопытно, что, какие части вы находите «симпатичными»? –

+0

Я просто получил удовольствие от чтения. Я бы не подумал об этом. Все еще не уверен, почему я хочу ... Тем не менее, определенно умный. –

+0

Gotcha! Это здорово, когда у вас нет возможности запуска пользовательских Android-ROM или расширения возможностей приложений с закрытым исходным кодом. –

Смежные вопросы