通过反射检索的对象上的同步

时间:2014-12-30 18:27:21

标签: java android multithreading reflection synchronized

我通过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块一起工作?

供参考,以下是findClassgetStaticObjectField的代码。前者基本上从Class<?>返回org.external.org.apache.commons.lang3.ClassUtils,后者(实质上)在getDeclaredField参数上调用Class<?>,将Field设置为可访问,并且在get(null)上返回Field的结果。

1 个答案:

答案 0 :(得分:1)

有一些警告,但答案是&#34;是&#34;。无论您如何获得引用,对象都是一个对象。如果您在引用上进行同步,则使用与引用同步的其他所有人相同的锁。

最重要的警告是,您必须确保它是对相同对象的引用。我只是看了看Xposed中的代码(可爱的东西,顺便说一下;可能会失败&gt; = 5.0)而且我看不到被编组/解组的对象,所以一切看起来都不错。例如,如果您正在同步的对象是ParcelableBinder,请注意,因为可能会有多个&#34;相同的&#34;对象