博客
关于我
Objenesis创建类的实例
阅读量:795 次
发布时间:2023-02-22

本文共 1763 字,大约阅读时间需要 5 分钟。

Objenesis简明介绍

在阅读Spring源码的过程中,我偶然发现了Objenesis这个库。经过进一步研究和实践,以下是我对Objenesis的理解和使用体会。

1. 什么是Objenesis?

Objenesis是一个专注于为特定类创建实例的小型框架。它通过动态代码生成的方式,能够绕过常见的Java对象创建限制,例如:

  • 私有构造方法(private no-arg constructor)
  • 带参数的构造方法(argumented constructor)
  • 构造方法抛异常(throwing constructor)

通过Objenesis,我们可以轻松地创建这些看似难以处理的类实例。

2. 如何引入Objenesis?

在项目中引入Objenesis,可以通过以下Maven依赖:

org.objenesis
objenesis
3.0.1

3. 使用Objenesis创建对象

让我们以一个简单的示例来说明如何使用Objenesis框架:

public class Person {    public Person() {        System.out.println("Person constructor function invoked");        throw new RuntimeException();    }    public void show() {        System.out.println("Person show function invoked" + this);    }    public static void main(String[] args) throws IllegalAccessException, InstantiationException {        // 使用Class.newInstance()会抛出异常        // Person p = Person.class.newInstance();        // 使用Objenesis创建实例        Objenesis objenesis = new ObjenesisStd();        ObjectInstantiator instantiator = objenesis.getInstantiatorOf(Person.class);        Person person = instantiator.newInstance();        person.show();        Person person1 = instantiator.newInstance();        person1.show();    }}

4. 运行结果

运行上述代码,输出结果如下:

Person show function invokedcom.example.demo.objenesis.Person@27bc2616Person show function invokedcom.example.demo.objenesis.Person@3941a79c

与传统的Class.newInstance()方法相比,Objenesis能够成功绕过构造函数抛出的异常,轻松创建出实例。

5. Objenesis的优势

  • 灵活性:支持各种构造方法,无论是否有参数,是否抛异常。
  • 简便性:操作简单,仅需几行代码即可创建对象。
  • 性能:代码生成和反射机制使得创建速度较快。
  • 可扩展性:支持自定义策略,适用于多种场景。

6. 注意事项

  • 反射权限:需要确保类被反射访问,否则可能会抛出IllegalAccessException
  • 构造方法的可见性:Objenesis能够处理私有构造方法,但需要正确配置反射权限。
  • 异常处理:构造方法可能抛出各种异常,需要确保Objenesis能够处理这些情况。

通过以上内容可以看出,Objenesis为Java对象创建提供了一种灵活的解决方案,特别适用于那些传统方式难以处理的场景。

转载地址:http://pssfk.baihongyu.com/

你可能感兴趣的文章
Object类有哪些方法,hashcode方法的作用,为什么要重写hashcode方法?
查看>>
Object类有哪些方法?各有什么作用?
查看>>
Objenesis创建类的实例
查看>>
OBObjective-c 多线程(锁机制) 解决资源抢夺问题
查看>>
OBS studio最新版配置鉴权推流
查看>>
Obsidian 彩色标题
查看>>
Obsidian的使用-ChatGPT4o作答
查看>>
Obsidian笔记记录GPT回复的数学公式无缝转化插件Katex to mathjax
查看>>
ObsoleteAttribute 可适用于除程序集、模块、参数或返回值以外的所有程序元素。 将元素标记为过时可以通知用户:该元素在产品的未来版本中将被移除。...
查看>>
OC block声明和使用
查看>>
OC Xcode快捷键
查看>>
oc 中的.m和.mm文件区别
查看>>
OC 中的重写 OC中没有重载 以及隐藏
查看>>
OC 内存管理黄金法则
查看>>
oc57--Category 分类
查看>>
occi库在oracle官网的下载针对vs2008
查看>>
OceanBase 安装使用详细说明
查看>>
OceanBase详解及如何通过MySQL的lib库进行连接
查看>>
ocp最新题库之052新题带答案整理-36题
查看>>
OCP题库升级,新版的052考试题及答案整理-18
查看>>