我有一个没有默认构造函数的类。我需要一种方法来获取此类的“空白”实例。 “空白”意味着实例化后所有类字段都应具有默认值 如 null、0 等
我问这个问题是因为我需要能够序列化/反序列化大对象树。而且我无法访问该对象类的源,并且类既没有默认构造函数,也没有实现可序列化。尝试序列化此类结构可能不是一个好主意,但替代方案是将其转换为更容易序列化的结构。
将类实例作为变量 clazz 提供:
ReflectionFactory rf = ReflectionFactory.getReflectionFactory();
Constructor objDef = parent.getDeclaredConstructor();
Constructor intConstr = rf.newConstructorForSerialization(clazz, objDef);
clazz.cast(intConstr.newInstance());
中所述
您的解决方案将特定于 JVM。
如果您需要便携式解决方案,请使用第三方库。
对于 Sun 的 JVM v1.5,您可以这样做:
final Class<?> myClass = MyClass.class;
final ReflectionFactory reflection = ReflectionFactory.getReflectionFactory();
final Constructor<Object> constructor =
reflection.newConstructorForSerialization(
myClass, Object.class.getDeclaredConstructor(new Class[0]));
final Object o = constructor.newInstance(new Object[0]);
System.out.print(o.getClass());
XStream中的相关类有:
我能想到的唯一解决方案是使用字节码操作库,例如 javassist 来添加默认构造函数。
如果您的类没有其他构造函数,那么编译器将为您创建一个。您可能有一个无参数构造函数但没有意识到它。
如果您不编写无参数构造函数,并且包含甚至一个带有参数的构造函数,那么编译器将不会给您一个。反射也无济于事:如果你试图找到一个无参数的构造函数,但没有,你期望会发生什么?
听起来您不能使用 java.lang.Serialized 来使用 Java 对象序列化,但这不是您唯一的选择。您还可以使用 XML、JSON、原型缓冲区或任何其他方便的协议。
可以使用 Java 反序列化对象时使用的相同机制:
ObjectStreamClass objectStreamClass = ObjectStreamClass.lookup(MyClass.class);
Method newInstance = ObjectStreamClass.getClass().getDeclaredMethod("newInstance");
newInstance.setAccessible(true);
Object instance = newInstance.invoke(objectStreamClass);