Objenesis
是一个用于实例化java类的小型Java库。
主要对于用户推荐使用以下3个API
- Objenesis
- ObjectInstantiator
- InstantiatorStrategy
首先得创建一个没有无参构建器的java类Example.java
public class Example { |
正常情况下这个类在外部情况 如果不调用Example(name)
这个构建方法 是没有办法实例化的,如果你正好有这个需求
这个时候Objenesis
就有用武之地了
方法一
Objenesis objenesis = new ObjenesisStd(true);
ObjectInstantiator thingyInstantiator = objenesis.getInstantiatorOf(Example.class);
Example example1 = (Example)thingyInstantiator.newInstance();
System.out.println("example1:"+example1+"---"+example1.getName());
Example example2 = (Example)thingyInstantiator.newInstance();
System.out.println("example2:"+example2+"---"+example2.getName());
Example example3 = (Example)thingyInstantiator.newInstance();
System.out.println("example3:"+example3+"---"+example3.getName());
运行结果 发现属性name原本我们是设置一个默认值的,利用Objenesis
实例化后默认值为null
了。
example1:Example@38cccef---null
example2:Example@5679c6c6---null
example3:Example@27ddd392---null
方法二
Example example4 =objenesis.newInstance(Example.class);
System.out.println("example4:"+example4+"----"+example4.getName());
同样也能够创建成功。
区别在与 如果想批量实例化多个对象 那么方法一的效率会更高 。
另外Objenesis
在spring4.0+版本中也有用到 不再强制要求写一个无参构造器了。kryo
序列化中也有用到。