我通过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
的代码。前者基本上从Class<?>
返回org.external.org.apache.commons.lang3.ClassUtils
,后者(实质上)在getDeclaredField
参数上调用Class<?>
,将Field
设置为可访问,并且在get(null)
上返回Field
的结果。
答案 0 :(得分:1)
有一些警告,但答案是&#34;是&#34;。无论您如何获得引用,对象都是一个对象。如果您在引用上进行同步,则使用与引用同步的其他所有人相同的锁。
最重要的警告是,您必须确保它是对相同对象的引用。我只是看了看Xposed中的代码(可爱的东西,顺便说一下;可能会失败&gt; = 5.0)而且我看不到被编组/解组的对象,所以一切看起来都不错。例如,如果您正在同步的对象是Parcelable
或Binder
,请注意,因为可能会有多个&#34;相同的&#34;对象