是否有可能在java中使用反射创建没有arg构造函数的类的"空白"实例?

Vla*_*mir 34 java reflection serialization constructor default-constructor

我有一个没有默认构造函数的类.我需要一种方法来获得这个类的"空白"实例.'blank'表示在实例化之后,所有类字段都应该具有默认值,如null,0等.

我问,因为我需要能够序列化/绝望化大对象树.并且我无法访问此对象类的源,并且类既没有默认构造函数也没有实现可序列化.尝试序列化这样的结构可能不是一个好主意,但另一种方法是将其转换为更容易序列化的东西.

Bra*_*pit 32

使用标准反射,没有,但有一个库可以为你做到:objenesis.

它专门用于实例化没有默认构造函数的类,并且它被其他序列化库(如xstream)使用.

注意:在这些情况下可能不会调用构造函数(但这可能是您想要的).


mcv*_*eat 20

将Class实例作为变量clazz提供:

ReflectionFactory rf = ReflectionFactory.getReflectionFactory();
Constructor objDef = parent.getDeclaredConstructor();
Constructor intConstr = rf.newConstructorForSerialization(clazz, objDef);
clazz.cast(intConstr.newInstance());
Run Code Online (Sandbox Code Playgroud)

http://www.javaspecialists.eu/archive/Issue175.html中所述

  • 请记住,ReflectionFactory类是Sun类,所以这只适用于Sun/Oracle VM,即便如此,它也可能会发生变化. (2认同)

joh*_*tok 6

您的解决方案将特定于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());
Run Code Online (Sandbox Code Playgroud)

XStream中的相关类是:

  • com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider
  • com.thoughtworks.xstream.core.JVM;