Czy Android ma sposób na tworzenie instancji obiektów bez wywoływania żadnego z jego konstruktorów?
W Javie Sun ma sun.reflect.ReflectionFactory.getReflectionFactory (). newConstructorForSerialization (), w .Net mamy System.Runtime.Serialization.FormatterServices.GetUninitializedObject () ale nie mogłem znaleźć czegoś takiego na platformie Android.
Odpowiedzi:
5 dla odpowiedzi № 1Po przeanalizowaniu kodu źródłowego Androida znaleźliśmy sposób na osiągnięcie tego celu za pomocą metody statycznej 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 dla odpowiedzi nr 2
Możesz to zrobić z natywnego kodu za pomocą funkcji JNI AllocObject. Widzieć specyfikacja JNI. Wywołanie kodu rodzimego będzie droższe niż wywołanie konstruktora no-op, ale prawdopodobnie tańsze niż wywołanie konstruktora, który zgłasza wyjątek.
Nie wiem, czy istnieje inny sposób, aby to zrobić. Nic mnie nie wyskakuje.
0 dla odpowiedzi № 3
Nie sądzę, jednak platforma Android zawiera API Java Reflection API java.lang.reflect.*
więc wszystko, co jest możliwe przy użyciu Java Reflection API, jest możliwe w Androidzie