1
2
3
4
5 package mockit.internal.expectations.mocking;
6
7 import edu.umd.cs.findbugs.annotations.NonNull;
8 import edu.umd.cs.findbugs.annotations.Nullable;
9
10 import mockit.internal.util.StackTrace;
11
12 import org.objenesis.ObjenesisHelper;
13
14
15
16
17
18 public abstract class InstanceFactory {
19
20 @NonNull
21 private final Class<?> concreteClass;
22 @Nullable
23 Object lastInstance;
24
25 InstanceFactory(@NonNull Class<?> concreteClass) {
26 this.concreteClass = concreteClass;
27 }
28
29 @NonNull
30 @SuppressWarnings("unchecked")
31 final <T> T newUninitializedConcreteClassInstance() {
32 try {
33 return (T) ObjenesisHelper.newInstance(concreteClass);
34 } catch (Exception e) {
35 StackTrace.filterStackTrace(e);
36 e.printStackTrace();
37 throw e;
38 }
39 }
40
41 @NonNull
42 public abstract Object create();
43
44 @Nullable
45 public final Object getLastInstance() {
46 return lastInstance;
47 }
48
49 public abstract void clearLastInstance();
50
51 static final class InterfaceInstanceFactory extends InstanceFactory {
52 @Nullable
53 private Object emptyProxy;
54
55 InterfaceInstanceFactory(@NonNull Object emptyProxy) {
56 super(emptyProxy.getClass());
57 this.emptyProxy = emptyProxy;
58 }
59
60 @NonNull
61 @Override
62 public Object create() {
63 if (emptyProxy == null) {
64 emptyProxy = newUninitializedConcreteClassInstance();
65 }
66
67 lastInstance = emptyProxy;
68 return emptyProxy;
69 }
70
71 @Override
72 public void clearLastInstance() {
73 emptyProxy = null;
74 lastInstance = null;
75 }
76 }
77
78 static final class ClassInstanceFactory extends InstanceFactory {
79 ClassInstanceFactory(@NonNull Class<?> concreteClass) {
80 super(concreteClass);
81 }
82
83 @Override
84 @NonNull
85 public Object create() {
86 lastInstance = newUninitializedConcreteClassInstance();
87 return lastInstance;
88 }
89
90 @Override
91 public void clearLastInstance() {
92 lastInstance = null;
93 }
94 }
95 }