如何通过Android上的reflection实例化成员类
我有一个保存/加载框架,应该保存任意对象图。 这包括非静态嵌套类的实例。
嵌套类需要由创建它们的父类实例拥有,嵌套类使用合成字段知道它所属的实例。
举个简单的例子,我提出这个类:
public class Foo implements Savable { private class Bar implements Savable { public void saveState(Saver saver) { saver.putInt(3); } } private Bar myBar = new Bar(); public void saveState(Saver saver) { saver.putSavable(myBar); } }
在“标准”编译器上,以下代码可以很好地接受一个对象( myBar
),找到它的父( Foo
一个特定实例),并保持对子的引用:
if (objectClass.isMemberClass()) { //We are a member class, which means we are a non-static inner class, and therefore must save our parent. Field[] fields = objectClass.getDeclaredFields(); //We loop through each of our fields to find the synthetic field created by the compiler that points to our parent. for (Field f : fields) { String name = f.getName(); //The synthetic field pointing to the parent is named something like "this$0". At least, with the "standard" compiler it is. if (name.startsWith("this$")) { f.setAccessible(true); Savable parent = (Savable)f.get(objectClass); saver.putSavable("_parent", parent); break; } } if (!saver.containsKey("_parent")) { throw new RuntimeException("Could not find the owner of inner class: " + objectClass); } }
所以,就像我说的,这在“标准”编译器上运行得很好。 然后在加载时,类似的事情发生,除了我寻找一个构造函数,它接受父类的实例并实例化它,传入父类。
但!
它不适用于Android VM。 没有合成字段,构造函数看起来都很正常,就像它们不接受父实例一样。
我在这里SOL吗? 这个VM显然不喜欢我的方法。 有什么我可以在这里做,而不要求内部类知道他们需要保存对其父类实例的引用?
好吧,事实certificate我正在咆哮着错误的树。 我概述的方法在Android上以及其他任何地方都能很好地运行。 问题是我在这种情况下试图实例化的类是静态内部类。 因此,虽然它是一个成员类,但它没有引用它的外部类。 我只需要在查找合成构造函数/字段之前检查if (!Modifier.isStatic(objectClass.getModifiers()))
。
- Android从MySql表中获取数据
- 生成一个频率的单个周期?
- java.lang.IllegalStateException:预期BEGIN_ARRAY但在第1行第2列是BEGIN_OBJECT
- 有没有办法在Android KitKat中以编程方式阻止SMS?
- Android SOAP wsdl
- Gson.toJson给出了StackOverFlowError,在这种情况下如何获得正确的json? (公共静态类)
- Gradle Build对于任务应用程序失败:processReleaseResources
- ParseQuery NullPointerexception悖论
- 由于缺少java类,Android Studio 3.1无法呈现xml文件