該文檔翻譯自O(shè)bjenesis官方文檔
原文鏈接:http://objenesis.org/tutorial.html
二十秒教程
在Objenesis中有兩個(gè)主要的接口:
-
ObjectInstatiator
- 初始化一個(gè)單獨(dú)的類(lèi)的多個(gè)實(shí)例 -
InstantiatorStrategy
- 一個(gè)特定的策略來(lái)決定怎么實(shí)力化一個(gè)類(lèi)(對(duì)不同類(lèi)型的類(lèi)這個(gè)策略是不同的)
注意:所有的Objenesis類(lèi)都位于
oeg.objenesis
包中
一步步進(jìn)行
Objenesis使用了許多不同的策略來(lái)基于JVM提供商你虹、JVM版本進(jìn)行實(shí)例化對(duì)象司草,從而SecurityManager和class的類(lèi)型將被實(shí)例化突委。
我們已經(jīng)定義了兩種不同種類(lèi)的必要的實(shí)例:
-
Standard
- 沒(méi)有構(gòu)造方法被調(diào)用 -
Serializable compliant
- 表現(xiàn)的像是一個(gè)對(duì)象被通過(guò)java標(biāo)準(zhǔn)的序列化而被實(shí)例化驮肉。這意味著第一個(gè)不可序列化的父類(lèi)的構(gòu)造方法將被調(diào)用。然而腾窝,readResolve沒(méi)有被調(diào)用吕座,并且如果這個(gè)對(duì)象是可序列化的那么我們將從不檢查它专缠。
使用Objenesis最簡(jiǎn)單的方法是通過(guò)使用ObjenesisStd(Standard)和ObjenesisSerializer(Serializable compliant)。默認(rèn)地捂龄,將會(huì)自動(dòng)地決定使用哪種策略--所以你沒(méi)必要指定释涛。
Objenesis objenesis = new ObjenesisStd(); // or ObjenesisSerializer
一旦你有了這個(gè)Objenesis的實(shí)現(xiàn)加叁,就能夠在接下來(lái)為一個(gè)具體的類(lèi)型創(chuàng)建一個(gè)ObjectInstantiator
。
ObjectInstantiator thingyInstantiator = objenesis.getInstantiatorOf(MyThingy.class);
最終唇撬,你能使用它來(lái)為這個(gè)類(lèi)型來(lái)實(shí)例化新的實(shí)例它匕。
MyThingy thingy1 = (MyThingy)thingyInstantiator.newInstance();
MyThingy thingy2 = (MyThingy)thingyInstantiator.newInstance();
MyThingy thingy3 = (MyThingy)thingyInstantiator.newInstance();
性能和線程
為了提高性能,最好能夠盡可能地重用ObjectInstantiator
對(duì)象窖认。比如豫柬,如果你正在實(shí)例化一個(gè)類(lèi)的多個(gè)實(shí)例,請(qǐng)通過(guò)同一個(gè)ObjectInstantiator
進(jìn)行耀态。
InstantiatorStrategy
和ObjectInstantiator
兩者都能夠在多線程和并發(fā)情況下共享轮傍。它們是線程安全的。
完整代碼
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();