Можно ли обойтись без конструкторов при создании объектов в Android
Есть ли в Android способ создания объектов без вызова каких-либо его конструкторов?
В Java у Sun есть sun.reflect.ReflectionFactory.getReflectionFactory(). NewConstructorForSerialization (), в.Net у нас есть http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatterservices.getuninitializedobject.aspx, но я не смог найти ничего подобного в платформе Android.
3 ответа
Изучив исходный код 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);
}
Вы можете сделать это из собственного кода с помощью функции JNI AllocObject. Смотрите спецификацию JNI. Вызов нативного кода будет более дорогим, чем вызов неиспользуемого конструктора, но, вероятно, дешевле, чем вызов конструктора, который выдает исключение.
Я не знаю, есть ли другой способ сделать это. Ничто не прыгает на меня.
Я не верю в это, однако платформа Android содержит Java Reflection API в java.lang.reflect.*
так что все, что возможно с помощью Java Reflection API, возможно в Android
Я обнаружил библиотеку, которая может обрабатывать 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/