1.Objenesis
Objenesis 是一个小的 java 库,主要用来实例化类对象,java 本身仅支持通过构造器实例化,实例化时必须使用合适的构造器
一些常见的类库都要求类包含一个默认的无参构造器,而 Objenesis 可以绕过构造器来实例化对象
默认使用的实例化策略对象类型为 StdInstantiatorStrategy,会根据 JVM 供应商的不同,JVM 版本的不同来选择不同的实例化器。
如我们使用的 HotSpot 虚拟机,就会使用 SunReflectionFactoryInstantiator 实例化器,底层使用 ReflectionFactory 类来实例化对象,
如果上述条件都不满足就会使用 UnsafeFactoryInstantiator 实例化器,内部使用 Unsafe 类的 allocateInstance() 方法实例化对象
2.示例
<dependency>
<groupId>org.objenesis</groupId>
<artifactId>objenesis</artifactId>
<version>3.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
public class Person {
private String age = "18";
private String name;
public Person() {
System.out.println("- - - Person() - - -");
}
public Person(String name) {
this.name = name;
System.out.println("- - - Person(String name) - - -");
}
@Override
public String toString() {
return "Person{" +
"age='" + age + '\'' +
", name='" + name + '\'' +
'}';
}
}
3.测试
@Test
public void testObject() {
Person person = new Person();
// 输出结果
// - - - Person() - - -
// Person{age='18', name='null'}
System.out.println(person);
}
@Test
public void testObjenesis() {
// 创建 Objenesis,内部包含一个实例化策略对象 StdInstantiatorStrategy
Objenesis objenesis = new ObjenesisStd();
// 获取对象实例化器
ObjectInstantiator<Person> objectInstantiator = objenesis.getInstantiatorOf(Person.class);
// 实例化对象
Person person = objectInstantiator.newInstance();
// Person person = objenesis.newInstance(Person.class);
// 输出结果
// Person{age='null', name='null'}
System.out.println(person);
}