objenesis的基本使用方法
不使用构造方法创建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的基本使用方法相关推荐
- 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群
作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...
- Java面试题大全2021版
一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...
- junit:junit_处理JUnit中异常的另一种方法:catch-exception
junit:junit JUnit中有许多处理异常的方法 (JUnit中有3种处理异常的方法.选择哪一种? JUnit ExpectedException规则:超越了基础 ). 在这篇文章中,我将介绍 ...
- 处理JUnit中异常的另一种方法:catch-exception
JUnit中有许多处理异常的方法 (JUnit中有3种处理异常的方法.选择哪一种呢? JUnit ExpectedException规则:超越了基础 ). 在本文中,我将介绍建议尝试的catch-ex ...
- mockito mock void方法_一文让你快速上手 Mockito 单元测试框架
前言 在计算机编程中,单元测试是一种软件测试方法,通过该方法可以测试源代码的各个单元功能是否适合使用.为代码编写单元测试有很多好处,包括可以及早的发现代码错误,促进更改,简化集成,方便代码重构以及许多 ...
- 各种OOM代码样例及解决方法
点击上方「蓝字」关注我们 针对目前大家对OOM的类型不太熟悉,那么来总结一下各种OOM出现的情况以及解决方法.把各种OOM的情况列出来,然后逐一进行代码编写复现和提供解决方法. 1. 堆溢出-java ...
- Kotlin协程使用,协程使用注意事项,协程中的await方法使用|不使用suspend使用协程
参见 码云 协程使用方法一 (Dispatchers调度器模式) 指定不同线程.同线程会挂起并阻塞(挂起是不影响主线程执行,阻塞是同样的IO线程会阻塞) withContext(Dispatchers ...
- IDEA中将代码块封装为方法,IDEA代码重构快捷键
IDEA中将代码块封装为方法 选中要转换的代码块,快捷键: Windows快捷键:Alt + Shift + M Mac快捷键:Alt + Command + M 如图:
- IDEA自动生成对象所有set方法
idea中有一款插件能够生成对象所有的set方法,GenerateAllSetter :下载地址 步骤1:将下载好的压缩包放在自己记得的文件夹中,在idea中进行导入 步骤2:在本地选中刚才的压缩包, ...
- List元素互换,List元素转换下标,Java Collections.swap()方法实例解析
Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...
最新文章
- numpy.newaxis详解
- hdu2709 Sumsets 递推
- MapDB的使用实战[基于Java的数据库]
- 转:js中arguments详解
- Java案例:功夫熊猫
- GraphPad Prism 中文版 科研绘图工具
- 创新科技普济天下,华为无线重构世界
- Windows 7可以拯救微软Netbook市场
- 三维地图3DGIS平台技术指标要求规划
- win10开机内存占用过高
- inc si指令的作用_亲水作用色谱(HILIC)(二):可选的固定相有哪些?
- Windows Vista for Developers——第三部分:桌面窗口管理器
- excel 通过身份证 计算 年龄、性别
- SqlSugar 6.导航查询
- 男人常吃6种食物当心伤精少精
- java手机 上网_Java也懂智能! 中低端手机上网小攻略
- Audition 入门系列(合集)_MediaTea的博客-CSDN博客
- 3.3 	计算球的体积
- 3GPP TS 29244-g30 中英文对照 | 5.4.15 Packet Rate enforcement
- 光引发剂主要用途_光引发剂2959特性和用途