Is it possible in java to create 'blank' instance of class without no-arg constructor using reflection?

后端 未结 5 1212
轻奢々
轻奢々 2020-12-08 19:57

I have a class which has not default constructor. And I need a way to get \'blank\' instance of this class. \'blank\' means that after instantiation all class fields should

相关标签:
5条回答
  • 2020-12-08 20:02

    Having Class instance provided as variable clazz:

    ReflectionFactory rf = ReflectionFactory.getReflectionFactory();
    Constructor objDef = parent.getDeclaredConstructor();
    Constructor intConstr = rf.newConstructorForSerialization(clazz, objDef);
    clazz.cast(intConstr.newInstance());
    

    as described in http://www.javaspecialists.eu/archive/Issue175.html

    0 讨论(0)
  • 2020-12-08 20:03

    Your solution will be JVM specific.

    If you need a portable solution use a 3rd party library.

    For Sun's JVM v1.5 you can do this:

        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());
    

    The relevant classes in XStream are:

    • com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider
    • com.thoughtworks.xstream.core.JVM;
    0 讨论(0)
  • 2020-12-08 20:11

    If your class has no other constructor, then the compiler will create one for you. You might have a no-arg constructor and not realize it.

    If you do not write a no-arg constructor, and you include even one constructor that takes an argument, then the compiler will not give you one. Reflection won't help, either: if you try to find a no-arg constructor and there isn't one, what do you expect to happen?

    It doesn't sound like you can use Java object serialization using java.lang.Serializable, but that's not your only choice. You can also use XML, or JSON, or prototype buffers, or any other protocol that's convenient.

    0 讨论(0)
  • 2020-12-08 20:24

    With standard reflection, no, but there is a library that can do it for you: objenesis.

    It's specifically designed to instantiate classes without default constructors, and it's used by other serialization libraries like xstream.

    Note: the constructor might not be called in these cases (but that's presumably what you want).

    0 讨论(0)
  • 2020-12-08 20:26

    The only solution I can think of would be to use a bytecode manipulation library such as javassist to add a default constructor.

    0 讨论(0)
提交回复
热议问题