不使用构造方法创建Java对象: objenesis的基本使用方法

objenesis简介:

objenesis是一个小型java类库用来实例化一个特定class的对象。由于不是所有的类都有无参构造器又或者类构造器是private,在这样的情况下,如果我们还想实例化对象,class.newInstance是无法满足的。

使用场合:

Java已经支持使用Class.newInstance()动态实例化类的实例。但是类必须拥有一个合适的构造器。有很多场景下不能使用这种方式实例化类,比如:

  • 构造器需要参数

  • 构造器有side effects

  • 构造器会抛异常

因此,在类库中经常会有类必须拥有一个默认构造器的限制。Objenesis通过绕开对象实例构造器来克服这个限制。

典型使用

实例化一个对象而不调用构造器是一个特殊的任务,然而在一些特定的场合是有用的:

  • 序列化,远程调用和持久化 -对象需要实例化并存储为到一个特殊的状态,而没有调用代码。

  • 代理,AOP库和Mock对象 -类可以被子类继承而子类不用担心父类的构造器

  • 容器框架 -对象可以以非标准的方式被动态实例化。

快速入门

Objenesis有两个主要的接口:

ObjectInstantiator -实例化一个类的多个实例

  • ObjectInstantiator - Instantiates multiple instances of a single class.

    interface ObjectInstantiator {Object newInstance();
    }
  • InstantiatorStrategy - A particular strategy for how to instantiate a class (as this differs for different types of classes).
    interface InstantiatorStrategy {ObjectInstantiator newInstantiatorOf(Class type);
    }

Note: All Objenesis classes are in the org.objenesis package.

使用方法

根据jvm供应商,版本和类的安全管理和类型的不同, Objenesis实例化对象有许多不同的策略。
有两种不同种类的实例化是必需的:

  • Stardard -没有构造器会被调用

  • Serilizable compliant -与java标准序列化方式实例一个对象的行为一致。即第一个不可序列化的父类构造器将被调用。 但是,readResolve不会被调用并且不检查对象是否是可序列化的。

最简单的使用Objenesis的方法是使用ObjenesisStd(Standard) 和ObjenesisSerializer(Serializable compliant)。这两种方式会自动选择最好的策略。

Objenesis objenesis = new ObjenesisStd(); // or ObjenesisSerializer
Once you have the Objenesis implementation, you can then create an ObjectInstantiator, for a specific type.ObjectInstantiator thingyInstantiator = objenesis.getInstantiatorOf(MyThingy.class);
Finally, you can use this to instantiate new instances of this type.MyThingy thingy1 = (MyThingy)thingyInstantiator.newInstance();
MyThingy thingy2 = (MyThingy)thingyInstantiator.newInstance();
MyThingy thingy3 = (MyThingy)thingyInstantiator.newInstance();

性能和多线程

为了提高性能,最好尽可能多的使用ObjectInstantiator 对象。 例如,如果要实例化一个类的多个对象,请使用相同的ObjectInstantiator。
InstantiatorStrategy和ObjectInstantiator都可以在多线程中共享并发使用,它们是线程安全的。

Objenesis objenesis = new ObjenesisStd(); // or ObjenesisSerializer
MyThingy thingy1 = (MyThingy) objenesis.newInstance(MyThingy.class);// or (a little bit more efficient if you need to create many objects)Objenesis objenesis = new ObjenesisStd(); // or ObjenesisSerializer
ObjectInstantiator thingyInstantiator = objenesis.getInstantiatorOf(MyThingy.class);MyThingy thingy2 = (MyThingy)thingyInstantiator.newInstance();
MyThingy thingy3 = (MyThingy)thingyInstantiator.newInstance();
MyThingy thingy4 = (MyThingy)thingyInstantiator.newInstance();

objenesis的基本使用方法相关推荐

  1. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群

    作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...

  2. Java面试题大全2021版

    一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...

  3. junit:junit_处理JUnit中异常的另一种方法:catch-exception

    junit:junit JUnit中有许多处理异常的方法 (JUnit中有3种处理异常的方法.选择哪一种? JUnit ExpectedException规则:超越了基础 ). 在这篇文章中,我将介绍 ...

  4. 处理JUnit中异常的另一种方法:catch-exception

    JUnit中有许多处理异常的方法 (JUnit中有3种处理异常的方法.选择哪一种呢? JUnit ExpectedException规则:超越了基础 ). 在本文中,我将介绍建议尝试的catch-ex ...

  5. mockito mock void方法_一文让你快速上手 Mockito 单元测试框架

    前言 在计算机编程中,单元测试是一种软件测试方法,通过该方法可以测试源代码的各个单元功能是否适合使用.为代码编写单元测试有很多好处,包括可以及早的发现代码错误,促进更改,简化集成,方便代码重构以及许多 ...

  6. 各种OOM代码样例及解决方法

    点击上方「蓝字」关注我们 针对目前大家对OOM的类型不太熟悉,那么来总结一下各种OOM出现的情况以及解决方法.把各种OOM的情况列出来,然后逐一进行代码编写复现和提供解决方法. 1. 堆溢出-java ...

  7. Kotlin协程使用,协程使用注意事项,协程中的await方法使用|不使用suspend使用协程

    参见 码云 协程使用方法一 (Dispatchers调度器模式) 指定不同线程.同线程会挂起并阻塞(挂起是不影响主线程执行,阻塞是同样的IO线程会阻塞) withContext(Dispatchers ...

  8. IDEA中将代码块封装为方法,IDEA代码重构快捷键

    IDEA中将代码块封装为方法 选中要转换的代码块,快捷键: Windows快捷键:Alt + Shift + M Mac快捷键:Alt + Command + M 如图:

  9. IDEA自动生成对象所有set方法

    idea中有一款插件能够生成对象所有的set方法,GenerateAllSetter :下载地址 步骤1:将下载好的压缩包放在自己记得的文件夹中,在idea中进行导入 步骤2:在本地选中刚才的压缩包, ...

  10. List元素互换,List元素转换下标,Java Collections.swap()方法实例解析

    Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...

最新文章

  1. numpy.newaxis详解
  2. hdu2709 Sumsets 递推
  3. MapDB的使用实战[基于Java的数据库]
  4. 转:js中arguments详解
  5. Java案例:功夫熊猫
  6. GraphPad Prism 中文版 科研绘图工具
  7. 创新科技普济天下,华为无线重构世界
  8. Windows 7可以拯救微软Netbook市场
  9. 三维地图3DGIS平台技术指标要求规划
  10. win10开机内存占用过高
  11. inc si指令的作用_亲水作用色谱(HILIC)(二):可选的固定相有哪些?
  12. Windows Vista for Developers——第三部分:桌面窗口管理器
  13. excel 通过身份证 计算 年龄、性别
  14. SqlSugar 6.导航查询
  15. 男人常吃6种食物当心伤精少精
  16. java手机 上网_Java也懂智能! 中低端手机上网小攻略
  17. Audition 入门系列(合集)_MediaTea的博客-CSDN博客
  18. 3.3 计算球的体积
  19. 3GPP TS 29244-g30 中英文对照 | 5.4.15 Packet Rate enforcement
  20. 光引发剂主要用途_光引发剂2959特性和用途

热门文章

  1. 第003讲 无序列表 有序列表 框架
  2. oracle 分区表详解
  3. python 常用函数用法
  4. Activity中通过标签获取当前Fragment
  5. angular.js学习笔记
  6. WPF-TreeView遍历硬盘所有目录
  7. mysql 循环插入记录
  8. 流媒体服务器架设(转载)
  9. IDEA集成Git使用教程
  10. helperdialect mysql_Mybatis使用pageHelper步骤(动态分页)