不使用构造方法创建Java对象: objenesis的基本使用方法
2017-02-22 16:11
330 查看
转载:http://blog.csdn.net/codershamo/article/details/52015206
构造器需要参数
构造器有side effects
构造器会抛异常
因此,在类库中经常会有类必须拥有一个默认构造器的限制。Objenesis通过绕开对象实例构造器来克服这个限制。
序列化,远程调用和持久化 -对象需要实例化并存储为到一个特殊的状态,而没有调用代码。
代理,AOP库和Mock对象 -类可以被子类继承而子类不用担心父类的构造器
容器框架 -对象可以以非标准的方式被动态实例化。
ObjectInstantiator -实例化一个类的多个实例
1
2
3
1
2
3
InstantiatorStrategy -对一个类的实例化进行特殊的策略处理(随着类的不同而不同)
1
2
3
1
2
3
注意:所有的Objenesis类都在org.objenesis包中
有两种不同种类的实例化是必需的:
Stardard -没有构造器会被调用
Serilizable compliant -与java标准序列化方式实例一个对象的行为一致。即第一个不可序列化的父类构造器将被调用。 但是,readResolve不会被调用并且不检查对象是否是可序列化的。
最简单的使用Objenesis的方法是使用ObjenesisStd(Standard) 和ObjenesisSerializer(Serializable compliant)。这两种方式会自动选择最好的策略。
1
1
实现Objenesis接口后,就可以为一个特定的类型创建一个ObjectInstantiator
1
1
最后,可以使用这个去新建实例
1
2
1
2
InstantiatorStrategy和ObjectInstantiator都可以在多线程中共享并发使用,它们是线程安全的。
objenesis简介:
objenesis是一个小型Java类库用来实例化一个特定class的对象。使用场合:
Java已经支持使用Class.newInstance()动态实例化类的实例。但是类必须拥有一个合适的构造器。有很多场景下不能使用这种方式实例化类,比如:构造器需要参数
构造器有side effects
构造器会抛异常
因此,在类库中经常会有类必须拥有一个默认构造器的限制。Objenesis通过绕开对象实例构造器来克服这个限制。
典型使用
实例化一个对象而不调用构造器是一个特殊的任务,然而在一些特定的场合是有用的:序列化,远程调用和持久化 -对象需要实例化并存储为到一个特殊的状态,而没有调用代码。
代理,AOP库和Mock对象 -类可以被子类继承而子类不用担心父类的构造器
容器框架 -对象可以以非标准的方式被动态实例化。
快速入门
Objenesis有两个主要的接口:ObjectInstantiator -实例化一个类的多个实例
interface ObjectInstantiator{ Object new Instance(); }
1
2
3
1
2
3
InstantiatorStrategy -对一个类的实例化进行特殊的策略处理(随着类的不同而不同)
interface InstantiatorStrategy{ ObjectInstantiator newInstantiaorOf(Class type); }
1
2
3
1
2
3
注意:所有的Objenesis类都在org.objenesis包中
使用方法
根据jvm供应商,版本和类的安全管理和类型的不同, Objenesis实例化对象有许多不同的策略。有两种不同种类的实例化是必需的:
Stardard -没有构造器会被调用
Serilizable compliant -与java标准序列化方式实例一个对象的行为一致。即第一个不可序列化的父类构造器将被调用。 但是,readResolve不会被调用并且不检查对象是否是可序列化的。
最简单的使用Objenesis的方法是使用ObjenesisStd(Standard) 和ObjenesisSerializer(Serializable compliant)。这两种方式会自动选择最好的策略。
Objenesis objenesis = new ObjenesisStd(); // or ObjenesisSerialializer
1
1
实现Objenesis接口后,就可以为一个特定的类型创建一个ObjectInstantiator
ObjectInstantiator thingInstantiator = objenesis.getInstantiatorOf(MyThingy.class);
1
1
最后,可以使用这个去新建实例
MyThingy thingy1 = (MyThingy)thingyInstantiator.newInstnace(); MyThingy thingy2 = (MyThingy)thingInstantiator.newInstance();
1
2
1
2
性能和多线程
为了提高性能,最好尽可能多的使用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();
相关文章推荐
- 不使用构造方法创建Java对象: objenesis的基本使用方法
- 不使用构造方法创建Java对象 Objenesis
- 2. Java面向对象之泛型-构造方法中使用
- java创建一个子类对象是会调用父类的构造方法会不会创建父类
- java 将构造方法变为私有的,为什么其他类不能创建该类的对象?
- java中使用字符串或者动态创建对象的三种方法(Class,Constructor,Proxy)
- 【Java】【TIJ】实现一个类:不允许用构造方法来直接创建类实例(对象)
- Java 反射创建类的实例对象(默认构造方法和私有构造方法)
- 继承与合成基本概念 继承:可以基于已经存在的类构造一个新类。继承已经存在的类就可以复用这些类的方法和域。在此基础上,可以添加新的方法和域,从而扩充了类的功能。 合成:在新类里创建原有的对象称为合成。
- java中创建String类型对象的两种方式以及在使用equals()和“==”两种方法时的区别
- 使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法
- java 程序加载过程---3--类中申明同时申明类的静态对象 创建类的实例 访问类的静态变量 调用类的静态方法 使用反射方法 初始化类的子类对象 直接使用java.exe 调用某个类
- 1105 Java中String字面值对象和构造方法创建对象的区别
- (十六)Core Java 枚举的使用(基本介绍,构造方法枚举,抽象方法枚举) (113)
- 2. Java面向对象之泛型-构造方法中使用
- Spring 创建对象的问题,不同构造方法创建对象,使用工厂类类获取对象、单例或多例、延迟创建问题
- 【Java】中类的构造方法与类中创建其他类对象的先后顺序
- java创建一个子类对象是会调用父类的构造方法会不会创建父类
- [java]反射机制给属性使用set方法构造对象
- java创建一个子类对象是会调用父类的构造方法会不会创建父类