代码之家  ›  专栏  ›  技术社区  ›  Vagaus

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

  •  6
  • Vagaus  · 技术社区  · 15 年前

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

    在爪哇,太阳有 Sun.Reflection.ReflectionFactory.GetReflectionFactory().NewConstructorForSerialization()。 ,在.NET中我们有 System.Runtime.Serialization.FormatterServices.GetUninitializedObject() 但我在Android平台上找不到类似的东西。

    3 回复  |  直到 14 年前
        1
  •  5
  •   Vagaus    14 年前

    在研究了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);
    
    }
    
        2
  •  2
  •   fadden    15 年前

    您可以使用jni allocobject函数从本机代码中完成这项工作。见 the JNI Spec . 调用本机代码比调用无操作构造函数要昂贵,但可能比调用引发异常的构造函数便宜。

    我不知道还有没有别的办法。我什么也没跳出来。

        3
  •  0
  •   chrisbunney Bogdan Calmac    15 年前

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