java · 2024-08-22 0

java 中 Objenesis 使用

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