不使用构造方法创建Java对象: objenesis的基本使用方法
来源:互联网 发布:表单验证 js 编辑:程序博客网 时间:2024/06/08 18:13
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 ObjenesisSerializerMyThingy thingy1 = (MyThingy) objenesis.newInstance(MyThingy.class);// or (a little bit more efficient if you need to create many objects)Objenesis objenesis = new ObjenesisStd(); // or ObjenesisSerializerObjectInstantiator thingyInstantiator = objenesis.getInstantiatorOf(MyThingy.class);MyThingy thingy2 = (MyThingy)thingyInstantiator.newInstance();MyThingy thingy3 = (MyThingy)thingyInstantiator.newInstance();MyThingy thingy4 = (MyThingy)thingyInstantiator.newInstance();
(译自 http://objenesis.org/)
- 不使用构造方法创建Java对象: objenesis的基本使用方法
- 不使用构造方法创建Java对象: objenesis的基本使用方法
- 不使用构造方法创建Java对象 Objenesis
- objenesis——不使用构造方法创建Java对象
- Java类对象的创建以及构造方法总结
- 关于构造方法与对象的创建
- 4.3 构造方法与对象的创建
- 1105 Java中String字面值对象和构造方法创建对象的区别
- java面试题:String字面值对象和构造方法创建对象的区别
- 用构造方法构建对象时使用new关键字和不使用new关键字的差别
- All About JAVA 关于JAVA对象的创建以及构造方法(1)
- All About JAVA 关于JAVA对象的创建以及构造方法(2)
- Java构造器(构造方法)的使用
- 【Java】中类的构造方法与类中创建其他类对象的先后顺序
- java 将构造方法变为私有的,为什么其他类不能创建该类的对象?
- javaScript系列之使用构造方法创建js对象(八)
- Java的file对象的构造方法
- Java创建对象的方法
- jQuery 尺寸
- LeetCode题解目录
- MongoDB学习——第一天 基础入门
- 大数据分析界的“神兽”Apache Kylin有多牛?
- XML
- 不使用构造方法创建Java对象: objenesis的基本使用方法
- WebSocket学习总结
- CSS——语法
- Activity次级页面和主页间来回跳转,防止重复创建Activity实例
- Andoid 总线设计 (二)
- linux shadowsocks客户端配置
- hibernate
- HDU 1711 Number Sequence(kmp模板)
- ubuntu:unrar 的使用