該文檔翻譯自Objenesis官方文檔
原文鏈接:http://objenesis.org/tutorial.html
二十秒教程
在Objenesis中有兩個主要的接口:
-
ObjectInstatiator
- 初始化一個單獨的類的多個實例 -
InstantiatorStrategy
- 一個特定的策略來決定怎么實力化一個類(對不同類型的類這個策略是不同的)
注意:所有的Objenesis類都位于
oeg.objenesis
包中
一步步進行
Objenesis使用了許多不同的策略來基于JVM提供商、JVM版本進行實例化對象,從而SecurityManager和class的類型將被實例化。
我們已經定義了兩種不同種類的必要的實例:
-
Standard
- 沒有構造方法被調用 -
Serializable compliant
- 表現的像是一個對象被通過java標準的序列化而被實例化。這意味著第一個不可序列化的父類的構造方法將被調用。然而,readResolve沒有被調用,并且如果這個對象是可序列化的那么我們將從不檢查它。
使用Objenesis最簡單的方法是通過使用ObjenesisStd(Standard)和ObjenesisSerializer(Serializable compliant)。默認地,將會自動地決定使用哪種策略--所以你沒必要指定。
Objenesis objenesis = new ObjenesisStd(); // or ObjenesisSerializer
一旦你有了這個Objenesis的實現,就能夠在接下來為一個具體的類型創建一個ObjectInstantiator
。
ObjectInstantiator thingyInstantiator = objenesis.getInstantiatorOf(MyThingy.class);
最終,你能使用它來為這個類型來實例化新的實例。
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();