Можно ли обойтись без конструкторов при создании объектов в Android - PullRequest
6 голосов
/ 26 июня 2010

Есть ли у Android способ создания объектов без вызова каких-либо его конструкторов?

В Java у Sun есть sun.reflect.ReflectionFactory.getReflectionFactory (). NewConstructorForSerialization () , в .Net мы имеем System.Runtime.Serialization.FormatterServices.GetUninitializedObject () , но я не смог найти ничего подобного на платформе Android.

Ответы [ 4 ]

5 голосов
/ 10 августа 2010

Изучив исходный код 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 голосов
/ 29 июня 2010

Вы можете сделать это из собственного кода с помощью функции JNI AllocObject.См. Спецификация JNI .Вызов нативного кода будет более дорогим, чем вызов конструктора без операции, но, вероятно, дешевле, чем вызов конструктора, который вызывает исключение.

Я не знаю, есть ли другой способ сделать это.Ничто не прыгает на меня.

0 голосов
/ 17 июня 2019

Я обнаружил библиотеку, которая может обрабатывать OBJ init с обходом конструктора http://objenesis.org/index.html И у них разные методы для разных API. Существует небольшая разница в их API 17 и 18+, как в текущем предложенном ответе. Также Android N + использует что-то под названием Unsafe, которое должно быть реализовано новыми JVM http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/

0 голосов
/ 26 июня 2010

Я не верю, однако платформа Android содержит API отражения Java в java.lang.reflect.*, поэтому в Android

возможно все, что возможно с помощью API отражения Java.
...