6

Android 有没有办法在不调用任何构造函数的情况下实例化对象?

在 Java 中,Sun 有sun.reflect.ReflectionFactory.getReflectionFactory().newConstructorForSerialization(),在 .Net 中有System.Runtime.Serialization.FormatterServices.GetUninitializedObject()但我在 Android 平台上找不到类似的东西。

4

4 回答 4

5

在查看 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);

}
于 2010-08-10T11:26:28.060 回答
2

您可以使用 JNI AllocObject 函数从本机代码执行此操作。请参阅JNI 规范。调用本机代码将比调用无操作构造函数更昂贵,但可能比调用抛出异常的构造函数更便宜。

我不知道是否有其他方法可以做到这一点。什么都没有向我扑来。

于 2010-06-28T21:12:23.443 回答
0

我不这么认为,但是 Android 平台确实包含 Java Reflection API,java.lang.reflect.*因此在 Android 中使用 Java Reflection API 可能的任何事情都是可能的

于 2010-06-25T21:30:24.743 回答
0

我发现了一个可以通过构造函数绕过http://objenesis.org/index.html处理 OBJ init 的库, 并且它们对不同的 API 有不同的方法。他们的 API 17 和 18+ impl 与当前建议的答案略有不同。Android N+ 也在使用一种叫做 Unsafe 的东西,应该由新的 JVM 来实现http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/

于 2019-06-17T05:00:58.717 回答