在Android中实例化对象时是否可以绕过构造函数

在Android中实例化对象时是否可以绕过构造函数,android,constructor,objectinstantiation,Android,Constructor,Objectinstantiation,安卓是否有任何方法可以在不调用任何构造函数的情况下实例化对象 在Java中,Sun拥有Sun.reflect.ReflectionFactory.getReflectionFactory().newConstructorForSerialization(),在.Net中我们拥有,但我在Android平台上找不到类似的东西。我不这么认为,然而,Android平台在Java.lang.reflect.*中确实包含Java反射API,因此任何可能使用Java反射API的操作都可以在Android中实现

安卓是否有任何方法可以在不调用任何构造函数的情况下实例化对象


在Java中,Sun拥有Sun.reflect.ReflectionFactory.getReflectionFactory().newConstructorForSerialization(),在.Net中我们拥有,但我在Android平台上找不到类似的东西。

我不这么认为,然而,Android平台在
Java.lang.reflect.*
中确实包含Java反射API,因此任何可能使用Java反射API的操作都可以在Android中实现

您可以使用JNI AllocObject函数从本机代码执行。看见调用本机代码将比调用无操作构造函数更昂贵,但可能比调用引发异常的构造函数更便宜


我不知道还有没有别的办法。没有什么能让我大吃一惊。

在研究了Android源代码之后,我们找到了一种通过使用ObjectInputStream#newInstance()静态方法实现这一点的方法

private Object newInstanceSkippingConstructor(final Class clazz) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException,     InvocationTargetException {

    Method newInstance = ObjectInputStream.class.getDeclaredMethod("newInstance", Class.class, Class.class);
    newInstance.setAccessible(true);
    return newInstance.invoke(null, clazz, Object.class);

}

我发现了一个可以通过构造函数旁路处理OBJ init的库 对于不同的API,它们有不同的方法。
他们的API 17和18+impl与当前建议的答案略有不同。另外,Android N+正在使用一种叫做“不安全”的东西,这种东西应该由新的JVM来实现。

我真的很想知道这种东西的用例是什么。你的目标是反序列化只有非空构造函数的所谓对象吗?这是一个有趣的请求。@Rich,Anthony,原因与序列化基础结构相同。我在oodb中工作,一旦实例化了对象,我们就设置了它的字段,因此调用构造函数至少是浪费时间/资源。在最坏的情况下,我们可能没有可行的构造函数可供使用(所有可用的构造函数在使用其参数的null/默认值调用时都可能抛出)@Quintin Robinson:基本上,我们不关心类是否有任何构造函数。如果可能的话,最好绕过调用任何构造函数。事实上,我注意到了这个包,但正如我所说的,我找不到任何东西来实现我的目标:(这是现在过时了吗?我使用的是API 19,没有ObjectInputStream.newInstance(类,类)方法。是否有其他方法?嘿,在Android源代码中查看此方法似乎确实已被删除。由于我不再使用此代码,我不知道是否有其他方法。ObjectInputStream中的代码依赖于类。newInstance(),它基于文档,调用了CTOR。