Objenesis是一个用于实例化java类的小型Java库。

主要对于用户推荐使用以下3个API

  • Objenesis
  • ObjectInstantiator
  • InstantiatorStrategy

首先得创建一个没有无参构建器的java类Example.java

public class Example {
//为属性设置一个默认值
private String name="没有无参构造函数";
// public Example(){}
public Example(String name){
System.out.println("创建了---"+Example.class.getName());
this.name=name;
}
public String getName() {
return this.name;
}
}

正常情况下这个类在外部情况 如果不调用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序列化中也有用到。

测试代码:https://github.com/peachyy/objenesis-example