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

Spring Objenesis不使用构造函数实例化对象 objenesis是一个小型java类库用来实例化一个特定class的对象。 使用objenesis实例化对象 static class City { private String code; public City(String code) { super(); this.code = code; } } @Test public v... 阅读详情

objenesis简介:

objenesis是一个小型java类库用来实例化一个特定class的对象。

使用场合:

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

  • 构造器需要参数

  • 构造器有side effects

  • 构造器会抛异常

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

典型使用

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

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

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

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

快速入门

Objenesis有两个主要的接口:

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

interface ObjectInstantiator{
    Object new Instance();
}

InstantiatorStrategy -对一个类的实例化进行特殊的策略处理(随着类的不同而不同)

interface InstantiatorStrategy{
    ObjectInstantiator newInstantiaorOf(Class type);    
}

注意:所有的Objenesis类都在org.objenesis包中

使用方法

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

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

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

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

Objenesis objenesis = new ObjenesisStd(); // or ObjenesisSerialializer

实现Objenesis接口后,就可以为一个特定的类型创建一个ObjectInstantiator

ObjectInstantiator thingInstantiator = objenesis.getInstantiatorOf(MyThingy.class);

最后,可以使用这个去新建实例

MyThingy thingy1 = (MyThingy)thingyInstantiator.newInstnace();
MyThingy thingy2 = (MyThingy)thingInstantiator.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();

(译自 http://objenesis.org/)

objenesis.rar 使用 easymock出现如下错:java.lang.NoClassDefFoundError: org/objenesis/ObjenesisHelper 可能使用到些压缩文件下的jar包 立即下载

相关推荐

objenesis-1.2.jar

hiveserver2windos环境下所需要的依赖 放到hive对应的lib下 然后hive-site.xml中添加配置(路径记得改一下) hive.aux.jars.path file:///root/apache-hive-1.2.1-bin/lib/minlog-1.2.jar,file:///root/apache-hive-1.2.1-bin//lib/objenesis-1.2.jar,file:///root/apache-hive-1.2.1-bin//lib/reflectasm-1.07-shaded.jar The location of the plugin jars that contain implementations of user defined functions and serdes.

Objenesis 底层探究

Objenesis 是一个 Java 库,用于在不调用构造方法的情况下创建对象。由于绕过了构造方法,所以无法调用构造方法中的初始化逻辑。相应的,Objenesis 无法创建抽象类、枚举、接口的实例对象。

iCheetor 1377

spring-bean objenesis jar包

spring-bean 源码依赖的jar包,在部署spring-bean源码时用到

Objenesis,另一种实例化对象的方式

简介Objenesis是一个Java的库,主要用来创建特定的对象。由于不是所有的类都有无参构造器又或者有的类构造器是private等,在这样的情况下,如果我们还想实例化对象,class.newInstance是无法满足的。使用public class Test { private int i; public Test(int i){ this.i = i; ...

G-Lawliet的博客 6411

objenesis-2.6.jar

objenesis-2.6.jar

EPICS Phoebus手册1

EPICS客户端phoebus 手册

yuyuyuliang00的博客 3950

Objenesis 快速入门教程

Objenesis是一个轻量级的Java库,作用是绕过构造器创建一个实例。 Objenesis is a small Java library that serves one purpose: To instantiate a new object of a particular class. Java已经支持通过Class.newInstance()动态实例化Java类,但是这需要J

Ricky 7042

ArcGIS栅格拼接全攻略:从核心原理到色彩平衡与大数据处理

在GIS数据处理中,栅格拼接是一项基础且关键的操作,其本质是将多幅具有重叠区域的栅格图像无缝整合为一张完整地图。该技术涉及空间参考统一、像元对齐与色彩融合等核心原理,是构建连续地理空间数据的基石。其技术价值在于保障数据完整性、提升可视化效果,并为后续的空间分析提供可靠底图。在遥感影像处理、数字高程模型构建及地图制图等应用场景中,高质量的拼接成果至关重要。本文聚焦于ArcGIS平台,深入解析其栅格拼接工具,并针对常见的色彩不一致与大数据量处理难题,提供了基于**色彩平衡**和**金字塔**优化的实战解决方案,

weixin_33158887的博客 262

Trigger.dev v4.0调度能力终极指南:构建可靠定时任务的10个技巧 [特殊字符]

Trigger.dev v4.0带来了革命性的任务调度能力,让开发者能够轻松构建可靠、可扩展的定时任务系统。作为一款开源的AI工作流平台,Trigger.dev专注于提供强大的后台任务处理能力,特别是在v4.0版本中,其调度功能得到了全面升级,为构建复杂定时任务提供了完整的解决方案。 ## 为什么需要专业的任务调度系统? 在现代化应用开发中,定时任务无处不在:每日数据备份、定期发送通知、定时清

gitblog_00046的博客 468

Emscripten安装(wasm编译)

5:配置对应环境变量--替换成自己对应的安装路径(2025最新的Emscripten工具链默认使用LLVM/WebAssembly标准工作流,java依赖已经移除了,所以以下java环境不配,需要使用java的手动添加即可---->emsdk install java-8-152-64bit。3:下载相应的依赖库---->emsdk install latest(我这里下的是最新的,如果有指定版本,把latest替换成版本号即可)6:测试是否成功---> emcc- v/em++ -v。

qq_31578301的博客 554

微信支付V2,jsapi支付拉起收银台报错:调用支付JSAPI缺少参数:total_fee

拉起收银台报错

m0_54355172的博客 3872

JAVA 反射objenesis

objenesis是一个小型Java类库用来实例化一个特定class的对象。

存在,即合理 396

mybaits-plus通用CRUD详解及代码案例

文章目录mybaitsplus通用CRUD插入操作方法定义测试用例mybaitsplus主键生成策略设置自增主键设置输入主键:UUID:ID_WORKER_STR:ID_WORKER:更新操作根据id更新方法定义:方法步骤根据条件更新方法定义:更新步骤:根据条件更新(可以更新NULL)删除操作根据id删除方法定义:删除步骤:根据 entity 条件删除方法定义:删除步骤:根据ID 批量删除方法定义:删除步骤:查询操作根据id查询方法定义:查询步骤:根据id批量查询方法定义:查询步骤:根据 entity 条件

流楚丶格念的博客 3404

不使用构造方法创建Java对象 Objenesis

如果一个类没有参数为空的构造方法时候,那么你直接调用newInstance方法试图得到一个实例对象的时候是会抛出异常的。能不能有 办法绕过构造方法来实例化一个对象呢? Objenesis 为其提供了在四个不同的jvm上的解决方案。  Sun Hotspot VM, versions 1.3, 1.4, 1.5 and 1.6 GCJ version 3.4.4 (tested on W

maikelsong的专栏 1879

Playwright Test Agent 实战:零代码基础也能写自动化测试「喂饭教程」

本文详细介绍了Playwright智能体的三大核心组件:规划智能体设计测试策略,生成智能体转换用例为代码,修复智能体自动修正失败测试。教程包含环境配置步骤、智能体使用方法和实战案例,展示了如何通过自然语言指令快速创建稳定的测试脚本。相比传统方法,Playwright智能体大幅降低测试自动化门槛,提升效率并减少维护成本,使测试人员无需编码基础也能实现高质量的自动化测试。

blues_C的博客 2017

2026年算法工程师常见面试简答题

本文摘要:文章系统梳理了机器学习与深度学习中的30个核心概念,涵盖模型优化、评估指标、经典算法和大模型应用等关键知识点。主要内容包括:1)过拟合与欠拟合的成因及解决方法;2)偏差-方差权衡原理;3)数据划分与交叉验证策略;4)分类/回归任务评估指标选择;5)逻辑回归、决策树、SVM等传统算法解析;6)梯度下降优化与正则化技术;7)CNN、RNN、Transformer架构对比;8)Embedding表示与RAG技术。特别强调面试高频考点如XGBoost改进、注意力机制原理等,并给出实际工程中的解决方案建议,

不务正业的猿 349

Spring系列第30篇:jdk动态代理和cglib代理

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。《Java高级面试》《Java高级架构知识》《算法知识》《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!门用来创建对象,即使你没有空的构造函数,都木有问题,它不使用构造方法创建Java对象,所以即使你有空的构造方法,也是不会执行的。用法比较简单:@Test输出大家可以在User类中加一个默认构造函数,来验证一下上面的代码会不会调用默认构造函数?

2401_84152092的博客 940

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

不使用构造方法创建对象 Objenesis

如果一个类没有参数为空的构造方法时候,那么你直接调用newInstance方法试图得到一个实例对象的时候是会抛出异常的。能不能有 办法绕过构造方法来实例化一个对象呢? Objenesis 为其提供了在四个不同的jvm上的解决方案。 Sun Hotspot VM, versions 1.3, 1.4, 1.5 and 1.6 GCJ version 3.4.4 (tested on...

attis_wong的博客 398

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

objenesis:Java跳过构造方法初始化对象的小巧jar包

Objenesis 是一个 Java 开源库,主要作用是绕过对象的构造方法(包括私有构造方法)来创建对象实例。Java已经支持使用class.newinstance()的类动态实例化,但是必须要有一个合适的构造函数。而很多场景下类不能够用这种方式去实例化,例如:构造函数需要参数(Constructors that require arguments)有副作用的构造函数(Constructors that have side effects)

秃了也弱了 1232

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java编程之创建对象——Objenesis简单使用

一、背景 最近在研读Spring的官方文档,当在对照Spring源码时,发现了Objenesis的字样,于是谈谈究竟: package org.springframework.aop.framework; import java.lang.reflect.Constructor; import org.apache.commons.logging.Log; import org.apac...

IT- 研究者 1675

objenesis的基本使用方法

不使用构造方法创建Java对象: objenesis的基本使用方法 objenesis简介: objenesis是一个小型java类库用来实例化一个特定class的对象。由于不是所有的类都有无参构造器又或者类构造器是private,在这样的情况下,如果我们还想实例化对象,class.newInstance是无法满足的。 使用场合: Java已经支持使用Class.newInstance()...

liinux-Talk is cheap,show me the code. 516

Objenesis创建类的实例

我在读spring源码的时候,发现了Objenesis这个东西,网上查阅一番,总结一下。 Objenesis是一个小型的专门为特定的类创建实例的框架。 java中已经有了Class.newInstance()方法来创建对象,但是某些情况下并不合适,例如私有构造方法,带参数的构造方法,还有构造方法抛异常的,但是通过Objenesis框架却能很好的创建出这些对象。下面就来演示一下Objenesis框架的使用。 1.先引入依赖 ...

远方的少年 341

MarkItDown:一条命令把 PDF、Word、PPT 批量转成 Markdown

你的项目文件散落在 PDF、Word、Excel 里,但 LLM 只吃一种文本格式。MarkItDown 是一个把办公文档批量转 Markdown 的 Python 工具:按扩展名自动路由,输出保留标题、列表、表格等结构,直接就能喂给 LLM 或文本分析流水线。 ## 跑通它的最短路径 ```bash pip install 'markitdown[all]' markitdown path-

gitblog_00641的博客 444
上一篇: 三种深度拷贝方式的比较
下一篇: AbstractQueuedSynchronizer框架
codershamo
博客等级 码龄10年 22粉丝 12原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值